私はGoogleApps Scriptを初めて使用し、このプロジェクトに取り組むときにjavascriptを学びます。入門的なコードラボの過程で、1つのコマンドですべてのデータを配列に読み込み、操作を実行してから、1つのコマンドで書き込むためのベストプラクティスに注目しました。
Googleスプレッドシートでこれを行う方法を理解しましたが、Googleカレンダーでこれを行うにはどうすればよいですか?Google CalendarAPIとAdvancedGoogle Servicesを使用したバッチ処理について説明しているリンクをいくつか見つけましたが、その情報の利用方法がわかりませんでした。
私は基本的に、for
ループでGoogleカレンダーに繰り返しアクセスするのではなく、イベントをバッチ編集したいと思っています。
function deleteMonth() {
// Set Date range to delete
var today = new Date();
var firstDay = new Date(today.getFullYear(), today.getMonth(), 1);
var lastDay = new Date(today.getFullYear(), today.getMonth() + 1, 0);
// read spreadsheet data and get User Info from ss
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var idSheet = spreadsheet.getSheetByName('User Info');
//Get users from sheet in array of objects with properties from column header in
//'User Info' (name, email, year, calName, calID, early, late)
var userInfo = getSheetData(idSheet);
var deletedNames = "";
for (i = 0; i < userInfo.length; i++) {
var calID = userInfo[i].calID;
// if we have calID proceed to delete events
if (calID) {
console.time("get events");
var calendar = CalendarApp.getCalendarById(calID);
var events = calendar.getEvents(firstDay, lastDay);
console.timeEnd("get events");
// Delete events and add deleted name to string
// deletedNames
for (i = 0; i < events.length; i++) {
console.time("delete event");
deletedNames += events[i].getTitle() + ", ";
events[i].deleteEvent();
console.timeEnd("delete event");
}
}
}
spreadsheet.toast("Deleted events: \n" + deletedNames);
}
からの時間出力console.time()
:
関連性があると思われるその他の関連リンク:
私はあなたの目標を次のように信じています
このために、この答えはどうですか?
Calendar APIは、バッチリクエストを処理できます。バッチリクエストは、1回のAPI呼び出しで100リクエストを実行でき、非同期プロセスで処理できます。これにより、工程コストを削減できると思います。ただし、現段階では、残念ながら、1つのバッチで複数のカレンダーIDを使用することはできません。複数のカレンダーIDを含むリクエストを行うと、のエラーがCannot perform operations on different calendars in the same batch request.
発生します。したがって、あなたの場合、1つのカレンダーIDの月のすべてのイベントを1つのバッチリクエストで削除できます。カレンダーIDの数をリクエストする必要があります。これを現在の回避策として提案したいと思います。
ちなみに、スクリプトでは、スクリプトの変更点として、変数i
は1番目のforループと2番目のforループで使用されます。これにより、のすべての値userInfo
が使用されるわけではありません。これに注意してください。
スクリプトを実行する前に、高度なGoogleサービスでCalendarAPIを有効にしてください。
function deleteMonth() {
var today = new Date();
var firstDay = new Date(today.getFullYear(), today.getMonth(), 1);
var lastDay = new Date(today.getFullYear(), today.getMonth() + 1, 0);
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var idSheet = spreadsheet.getSheetByName('User Info');
var userInfo = getSheetData(idSheet);
var deletedNames = "";
var requests = []; // For batch requests.
for (i = 0; i < userInfo.length; i++) {
var req = [];
var calID = userInfo[i].calID;
if (calID) {
var calendar = CalendarApp.getCalendarById(calID);
var events = calendar.getEvents(firstDay, lastDay);
for (j = 0; j < events.length; j++) {
deletedNames += events[j].getTitle() + ", ";
var e = events[j];
req.push({
method: "DELETE",
endpoint: `https://www.googleapis.com/calendar/v3/calendars/${calID}/events/${e.getId().replace("@google.com", "")}`,
});
}
}
requests.push(req);
}
// Run batch requests.
requests.forEach(req => {
const limit = 100;
const split = Math.ceil(req.length / limit);
const boundary = "xxxxxxxxxx";
for (let i = 0; i < split; i++) {
const object = {batchPath: "batch/calendar/v3", requests: req.splice(0, limit)};
const payload = object.requests.reduce((s, e, i) => s += "Content-Type: application/http\r\nContent-ID: " + i + "\r\n\r\n" + e.method + " " + e.endpoint + "\r\nContent-Type: application/json; charset=utf-8\r\n\r\n" + JSON.stringify(e.requestBody) + "\r\n--" + boundary + "\r\n", "--" + boundary + "\r\n");
const params = {method: "post", contentType: "multipart/mixed; boundary=" + boundary, payload: payload, headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}, muteHttpExceptions: true};
var res = UrlFetchApp.fetch("https://www.googleapis.com/" + object.batchPath, params);
console.log(res.getContentText())
}
})
spreadsheet.toast("Deleted events: \n" + deletedNames);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加