GASでgoogleカレンダーへデータ移行時エラー「短時間に作成したカレンダーまたはカレンダーの予定の数が多すぎます」
GASを使いgoogleカレンダーへデータ登録時、以下のエラーが頻発し対応策がわかりません。
短時間に作成したカレンダーまたはカレンダーの予定の数が多すぎます。
しばらくしてからもう一度お試しください。
- カレンダー登録データ数は全6万件程度。2000件目程度で上記エラーが出現
- 2実行目以降は、次第に登録数が極端に減り、しまいには登録ができなくなります。
- 1実行あたり6分未満トリガーも設定しましたが、同エラーメッセが出現
- Gsuite有料会員です
- トリガの間に Utilities.sleep(1000) 等を追加してもエラーになります
- データ量が多いので、forを使用せずmap等を使用しています
なにか解決方法のヒントを頂けないでしょうか。
function func() {
var start_time = new Date();
// 現在アクティブなスプレッドシートを取得
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadSheet.getSheetByName('シート1');
var dd = sheet.getRange('A:E').getValues();
var lastcol = 6;
var properties = PropertiesService.getScriptProperties(); //途中経過保存用
var startRowKey = "startRow";
var triggerKey = "trigger";
var startRow = parseInt(properties.getProperty(startRowKey));
if(!startRow){
//初実行の場合
startRow = 1;
}
//シート記載
sheet.getRange(startRow+1, lastcol).setValue('開始/'+start_time+'開始行:'+startRow +'行目スタート');
Logger.log('開始:'+startRow +'+1行目スタート');
var cal = CalendarApp.getDefaultCalendar();
var n = 350;
var endRow = 1500;
if(startRow <= endRow ){
// 一部行のみ取得
var data = dd.slice( startRow, startRow += n );
try {
var result = data.map(function (d) {var ev = cal.createEvent('*'+d[0],new Date(d[1]),new Date(d[2]),{description:d[3],guests:d[4]}).setGuestsCanModify(true);});
properties.setProperty(startRowKey, startRow);
setTrigger(triggerKey, "func");
return;
} catch(e) {
Logger.log(startRow+'行まで'+'エラーの内容:' + e);
sheet.getRange(startRow-1, lastcol).setValue('エラー内容:' + e+'/終了時間'+new Date()+'行番号/'+startRow);
}
}
Logger.log('最終行終了:'+startRow);
sheet.getRange(startRow, lastcol).setValue('終了/'+new Date()+'最終行:'+startRow);
deleteTrigger(triggerKey);
properties.deleteProperty(startRowKey);
}
//指定したkeyに保存されているトリガーIDを使って、トリガーを削除する
function deleteTrigger(triggerKey) {
var triggerId = PropertiesService.getScriptProperties().getProperty(triggerKey);
if(!triggerId) return;
ScriptApp.getProjectTriggers().filter(function(trigger){
return trigger.getUniqueId() == triggerId;
})
.forEach(function(trigger) {
ScriptApp.deleteTrigger(trigger);
});
PropertiesService.getScriptProperties().deleteProperty(triggerKey);
}
//トリガーを発行
function setTrigger(triggerKey, funcName){
deleteTrigger(triggerKey); //保存しているトリガーがあったら削除
var dt = new Date();
dt.setMinutes(dt.getMinutes() + 1); //1分後に再実行
var triggerId = ScriptApp.newTrigger(funcName).timeBased().at(dt).create().getUniqueId();
//あとでトリガーを削除するためにトリガーIDを保存しておく
PropertiesService.getScriptProperties().setProperty(triggerKey, triggerId);
}