5

ドライブ上の Google カレンダーと「マスター スプレッドシート」を同期させる Google Apps Script を作成しようとしていますが、これは可能ですか? 次の 2 つの投稿を見つけました。

これは多くの if ステートメントとロジックを使用して実行できると確信していますが、もっと簡単な方法があるのではないでしょうか?

次の簡単なスクリプトを提供するだけになりました。本当に必要だったのは、2 つの列に基づいてイベントを追加することだけでしたが、これを開発するには時間がかかりすぎました。

function onOpen() {
  //spawns a menu with a button that triggers AddToCal
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Add event to calendar",
    functionName : "AddToCal"
  }];
  sheet.addMenu("Data To Calendar Plugin", entries);
};

function AddToCal(){

  //get the current row
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var cell = ss.getActiveCell();
  var R = cell.getRow();

  //grab values for current row to pass to calendar event
  var date_of_event = ss.getRange('G'+R).getValue();
  var date = new Date(date_of_event);
  var event_title = ss.getRange('A'+R).getValue();
  //access the calendar
  var cal = CalendarApp.getCalendarById('[IDREMOVED]');
  cal.createAllDayEvent(event_title,date);

  ss.toast("Event added to " + cal.getName());
  }
4

4 に答える 4

6

はい、双方向のイベント同期スクリプトを作成することは可能ですが、単純ではありません。あなたが参照するこれらの 2 つの投稿には、再利用できる部分がありますが、実際の同期で直面する課題に比べれば、かなり初歩的なものです。スプレッドシートに基づいてカレンダー エントリを作成するイベント予約システムについては、Using Google Apps Script をお読みになることをお勧めします(ただし、進行中の同期は行いません)。過去にそのスクリプトのデバッグを行ったことがあります。

同期は以下をサポートする必要があります。

  • いずれかの場所でのイベントの作成
  • いずれかの場所でのイベントの詳細の変更 (ただし、簡略化のためにイベントの詳細のサブセットのみを考慮することもできます)
  • いずれかの場所でのイベントの削除
  • 再発、例えばCalendarEvent.getEventSeries()対処(または回避することを選択)

これは、最初に使用できる疑似コードです。

Open Calendar, Read Calendar events into calArray (will all attributes you care for)
Open Spreadsheet, Read Spreadsheet events into sheetArray

For each event in calArray:
  Search for calEvent in sheetArray.
  If found, compare lastUpdated values.
    If equal, do nothing
    Otherwise copy most recently updated to least recently updated
    Continue with next event
  If not found then copy calEvent to new sheetEvent, including lastUpdated value.
  Continue with next event

For each event in the sheetArray (...that hasn't been handled yet)
  Similar logic above.

Write updated sheetArray to spreadsheet.
Write updated calEvents to calendar API (see note 1 below)

ノート:

  1. 一括更新の代わりに、calEvents へのすべての更新を配列に対して行い、すぐにカレンダー API に書き込むことができます。これにより、ローカルで変更を追跡する必要がなくなりますが、lastUpdated の値を変更することをお勧めします。

  2. CalendarEvent.getLastUpdated()calEvents を読み取るときに使用し、同様の値をスプレッドシートに保存して (onEditトリガーに関連付けて)、比較を容易にします。

  3. CalendarEvent.getId()スプレッドシートのイベントに対して記録するための比較が簡素化されます。また、カスタム メタデータをカレンダーに記録するために使用することもCalendarEvent.setTag(key,value)できます。たとえば、スプレッドシートで発生したイベントや同期されたイベントを示すことができます。(これらのタグは GCal UI からはアクセスできないため、スクリプトを介してのみアクセスできます。)

  4. 処理する日付の範囲またはイベントの数について検討し、スクリプトの範囲を制限する必要があります。そうしないと、実際の操作で必ず実行時間制限に遭遇します。

  5. カレンダー イベントの特性の中には、スプレッドシートで簡単に表現できないものがあります。たとえば、次のとおりです。

    • 来客名簿
    • リマインダー一覧
于 2013-04-01T15:19:19.257 に答える
4

他の投稿で述べたように (Henrique に感謝します)、私はしばらく時間を費やしました - 実際、それが私を GAS に導いた最初のきっかけでした - スプレッドシートとカレンダーの間のデータ交換に時間を費やしました。高等学校) をスプレッドシートで作成しており、Google カレンダーへの移行を処理する必要がありました。

しばらくすると、オンライン カレンダー インターフェースの方がイベントを作成するのにはるかに効果的であるように見えたので、カレンダー スクリプトにシートを使用しなくなりました !!

一方、GCal の印刷とプレゼンテーションのオプションは非常に限られているため、他の方向は依然として非常に有用であり、常に使用しています。

これは元の質問に関しては対象外であり、逸話的すぎるかもしれませんが、車輪を再発明する前に本当に必要なものについて徹底的に考える必要があることを指摘したかっただけです... Mogsdadが述べたように、いくつかのイベントパラメータはスプレッドシートのロジックで簡単に記述できず、最終的には元のツールよりも使用がはるかに複雑になる可能性があります。

双方向データ転送を使用して開発した唯一の本当に便利なツールは、多数の同様のイベントを削除または編集する必要がある場合の「バッチ変更ツール」です。

たとえば、年間を通じて何らかの理由で教師の名前を変更する必要がある場合、いくつかのクラスのすべてのイベントをインポートし、スプレッドシートの名前を置き換えて、クラス カレンダーを更新します... 5 分かかります。非常に簡単ですが、これらは非常に特殊な使用例であり、非常に一般的かどうかはわかりません。

とにかく、一部のイベントには時間がかかり、変更されるだけなので、それを「同期」とは呼びません...カレンダーを使用してスプレッドシートを最新の状態に保とうとしたことはありません。私の経験から、カレンダーはかなり信頼性が高く、それらを元のデータ ソースとして使用します。すでに述べたように、印刷とローカル アーカイブのためだけに、毎週スプレッドシートにデータをインポートしています。

この長くて少しあいまいなコメントで申し訳ありません (通常の 500 chs のコメントに収まるには長すぎました ;-)

于 2013-04-01T18:18:40.163 に答える
2

いいえ、ありません。Apps Script Calendar Service に関する多くの問題 (タイムゾーン、終日のイベント、クエリなど) は解決されましたが、それでもかなり複雑な作業です。

SOの #google-apps-script タグのトップ コントリビューターである Sergeが、Calendar Service に関連するかなりの数のスクリプトを開発したことは知っています。

しかし、カレンダーとスプレッドシートの間で双方向の更新を行った方法については知りません。それは難しいものでなければなりません。もしそうなら、親切に共有してください:)

于 2013-04-01T14:29:28.657 に答える