Googleカレンダーの読み取り/書き込みを高速化/バッチ処理する方法はありますか?

Nikhil Gupte

私はGoogleApps Scriptを初めて使用し、このプロジェクトに取り組むときにjavascriptを学びます。入門的なコードラボの過程で、1つのコマンドですべてのデータを配列に読み込み、操作を実行してから、1つのコマンドで書き込むためベストプラクティスに注目しました

Googleスプレッドシートでこれを行う方法を理解しましたが、Googleカレンダーでこれを行うにはどうすればよいですか?Google CalendarAPIAdvancedGoogle 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()

console.time()からの時間出力

関連性があると思われるその他の関連リンク:

  1. 高度なグーグルサービスの使用(アプリスクリプトリソース)
  2. Google Developerブログ?
タナイケ

私はあなたの目標を次のように信じています

  • Google Apps Scriptでバッチ処理を使用して、複数のカレンダーの1か月のすべてのイベントを削除するとします。
  • 上記のプロセスのプロセスコストを削減したい。

このために、この答えはどうですか?

問題と回避策:

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);
}

注意:

  • このスクリプトはV8で使用してください。

参照:

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パンダでファイルの読み取り/書き込みを高速化する方法はありますか?

分類Dev

レコードの読み取り/書き込み/読み取り/書き込み属性を型で表現する方法はありますか?

分類Dev

マルチプロセッシングキューの同時読み取りと書き込みを高速化するにはどうすればよいですか?

分類Dev

Kafka-Goを使用しているのに、読み取り/書き込みをバッチ処理しているように見えるのはなぜですか?不足している構成はありますか?

分類Dev

GILはチャンク化されたI / Oの読み取り/書き込みをどのように処理しますか?

分類Dev

MongoDB書き込みロックはセカンダリの読み取りをブロックしますか?

分類Dev

テキストモードでのcsvの書き込みとバイナリモードでの読み取りを処理するためのより良い方法はありますか?

分類Dev

Jenkins Pipeline Jobsの読み取り/書き込みロックをエミュレートする方法はありますか?

分類Dev

etcdはネットワークパーティション中に読み取り/書き込みをどのように処理しますか?

分類Dev

クラスターのArangoDB先行書き込みログを読み取る方法はありますか?

分類Dev

Springバッチで複数のリスナー(ステップ、読み取り、処理、書き込み、スキップ)を組み合わせる方法

分類Dev

バッチファイル-USBを読み取り/書き込みから読み取り専用に、またはその逆に切り替えます。

分類Dev

Python(おそらくパンダ)でファイルから配列を読み取るときに、最初の行(メタデータを含む)を処理してスキップするエレガントな方法はありますか?

分類Dev

cassandraで読み取り/書き込み要求を処理する方法

分類Dev

組み込みLinux:シリアルポートからのバイトの読み取りが遅すぎて転送を高速化できない

分類Dev

読み取り/書き込み機能をスレッドセーフ機能としてマークする公式文書はありますか?

分類Dev

ストリームからCSVファイルを読み取り、書き込まれたとおりに各行を処理する方法は?

分類Dev

読み取りアクセスを高速化するために、データを計算シェーダーの共有ストレージに「プリロード」することは理にかなっていますか?

分類Dev

ユーザーはFirebaseに対して読み取り/書き込みを行うためにアカウントを作成する必要がありますか

分類Dev

Pythonでのデータ読み取りを高速化しますか?

分類Dev

スレッドを使用してソケットからの複数の読み取り/書き込みを処理しますか?

分類Dev

読み取りパブリック書き込みプライベート変数を迅速に作成するさまざまな方法はありますか?

分類Dev

Javaのリスナーとの読み取り/書き込みロックはありますか?

分類Dev

Javaのリスナーとの読み取り/書き込みロックはありますか?

分類Dev

異なるスレッドからのパンダデータフレームでの読み取り/書き込みは安全ですか?

分類Dev

InputStreamからの読み取りとFileOutputStreamを使用した書き込みの高速化

分類Dev

マルチスレッドアプリケーションに対するLinuxデバイスドライバーでの読み取り/書き込みおよびリリースの処理

分類Dev

正しい形式のjson情報を.jsonファイルに書き込んでローカルで読み取る方法はありますか?

分類Dev

複数のタブでの読み取り/書き込みまたはバージョン変更により、インデックス付きデータベースがブロックされていることを検出する方法はありますか?

Related 関連記事

  1. 1

    パンダでファイルの読み取り/書き込みを高速化する方法はありますか?

  2. 2

    レコードの読み取り/書き込み/読み取り/書き込み属性を型で表現する方法はありますか?

  3. 3

    マルチプロセッシングキューの同時読み取りと書き込みを高速化するにはどうすればよいですか?

  4. 4

    Kafka-Goを使用しているのに、読み取り/書き込みをバッチ処理しているように見えるのはなぜですか?不足している構成はありますか?

  5. 5

    GILはチャンク化されたI / Oの読み取り/書き込みをどのように処理しますか?

  6. 6

    MongoDB書き込みロックはセカンダリの読み取りをブロックしますか?

  7. 7

    テキストモードでのcsvの書き込みとバイナリモードでの読み取りを処理するためのより良い方法はありますか?

  8. 8

    Jenkins Pipeline Jobsの読み取り/書き込みロックをエミュレートする方法はありますか?

  9. 9

    etcdはネットワークパーティション中に読み取り/書き込みをどのように処理しますか?

  10. 10

    クラスターのArangoDB先行書き込みログを読み取る方法はありますか?

  11. 11

    Springバッチで複数のリスナー(ステップ、読み取り、処理、書き込み、スキップ)を組み合わせる方法

  12. 12

    バッチファイル-USBを読み取り/書き込みから読み取り専用に、またはその逆に切り替えます。

  13. 13

    Python(おそらくパンダ)でファイルから配列を読み取るときに、最初の行(メタデータを含む)を処理してスキップするエレガントな方法はありますか?

  14. 14

    cassandraで読み取り/書き込み要求を処理する方法

  15. 15

    組み込みLinux:シリアルポートからのバイトの読み取りが遅すぎて転送を高速化できない

  16. 16

    読み取り/書き込み機能をスレッドセーフ機能としてマークする公式文書はありますか?

  17. 17

    ストリームからCSVファイルを読み取り、書き込まれたとおりに各行を処理する方法は?

  18. 18

    読み取りアクセスを高速化するために、データを計算シェーダーの共有ストレージに「プリロード」することは理にかなっていますか?

  19. 19

    ユーザーはFirebaseに対して読み取り/書き込みを行うためにアカウントを作成する必要がありますか

  20. 20

    Pythonでのデータ読み取りを高速化しますか?

  21. 21

    スレッドを使用してソケットからの複数の読み取り/書き込みを処理しますか?

  22. 22

    読み取りパブリック書き込みプライベート変数を迅速に作成するさまざまな方法はありますか?

  23. 23

    Javaのリスナーとの読み取り/書き込みロックはありますか?

  24. 24

    Javaのリスナーとの読み取り/書き込みロックはありますか?

  25. 25

    異なるスレッドからのパンダデータフレームでの読み取り/書き込みは安全ですか?

  26. 26

    InputStreamからの読み取りとFileOutputStreamを使用した書き込みの高速化

  27. 27

    マルチスレッドアプリケーションに対するLinuxデバイスドライバーでの読み取り/書き込みおよびリリースの処理

  28. 28

    正しい形式のjson情報を.jsonファイルに書き込んでローカルで読み取る方法はありますか?

  29. 29

    複数のタブでの読み取り/書き込みまたはバージョン変更により、インデックス付きデータベースがブロックされていることを検出する方法はありますか?

ホットタグ

アーカイブ