アプリ内にHTTPサーバーの機能を実装しないといけません。, HTTPサーバーを動作させつつ、承認の手続きをすすめるため、goroutine を利用します。 Updates metadata for a calendar. If you have a booking app, now you can automatically update a user's calendar automatically so they don't have to do it manually, or worse, have 2 Calendar entries where one's wrong. The field values you specify replace the existing values. あまりにも鬱陶しいので、重複したイベントを削除するアプリを作ろうと思い至りました。, その過程でサンプルをもとにカスタマイズする箇所も結構あったりして、どうせなのでまとめておこうと思います。, https://developers.google.com/calendar/quickstart/go に動作するサンプルがあります。 Returns free/busy information for a set of calendars. Faster. ファイル名は複数形です。この名前のファイルを読み取るようなプログラムになっていますので、間違いのないように。, 過去に同パッケージを取得している場合でも、Go のバージョンを上げたり、パッケージの更新をしていないと、「undefined: proto.ProtoPackageIsVersion3」というエラーが出たりするので、ちゃんと実行しておきましょう。, この時点で、プロジェクトディレクトリーには、credentials.json と quickstart.go があるはずです。, 最初にコンソールに URL が出力されるので、それをブラウザのアドレスバーにコピペして、アプリのアクセスを承認します。, 承認後、ブラウザにアクセスコードが表示されるので、今度はコンソールに貼り付けます。, プロジェクトディレクトリーを見てみてください。 持っていない方はこれを機に取得しておいても損はありません。, Googleアカウントの取得は以下からどうぞ。 parameters (learn more). 今年もアドベントカレンダーの季節がやってきました。カレンダーと言えば、みなさん大好きなカレンダーがもうひとつありますよね。, Googleカレンダー、便利ですよね。ただ、個人的に不満を感じている仕様がひとつあります。それは、「"予定作成時のゲストの変更権限"がデフォルトでOFF」ということ。, そのため、大半のユーザーは予定作成時に「予定を変更する」にチェックを入れず、予定の主催者(作成者)しか予定を編集できないようになり、「予定の主催者が不在なので、会議室や時間の変更ができない!」といった事態が起きがちです。ガルーンなど他のスケジューラでは、デフォルトで同席者が編集権限を持っていることが多いので、初めて使う方は戸惑うことが多いかもしれません。, 実は個々のカレンダー設定で、デフォルトのゲスト権限の設定を変更できるので、「予定を変更する」にチェックを入れておけば、毎回予定作成時にチェックを入れなくて済むのですが、この設定をしてくれないユーザーもいるので、結局ゲストに変更権限が無い予定が大量に生まれていきます。※組織の設定でこちらを強制的にONにできればいいんですが、現状ではできないとのサポートの回答でした。, ゲストの編集権限が無い予定が増えてくると、「休職に入る前に、特定の予定だけ主催者を変更しておきたい」「主催者が急に行方不明になって…」といったように、大量の予定を一括で変更したいケースも出てきます。管理コンソールで全予定の一括譲渡も可能ですが、部分的な譲渡はできないので、管理者が手でポチポチ変更していく必要があり、地味に対応が大変です。, それではまず、対象のカレンダーの予定を出力するGASを作成します。以下の画像のようなスプレッドシートを作成し、「イベント一覧取得」というシート名をつけておいてください。, 続いて、「ツール」→「スクリプトエディタ」を開き、以下のコードを貼り付けてください。※イベント更新用の関数は後ほど追記します, そのままスクリプトエディタの「リソース」→「Googleの拡張サービス」を開き、「Calendar API」をONにして保存します。, スクリプトを保存し、スプレッドシートをいったん閉じてから再度開いてください。「カレンダーID」に対象者のカレンダーID(一般ユーザーの場合はメールアドレスと同一)をセットし、「GAS実行」→「イベント取得」を実行すると、対象ユーザーの予定の一覧がスプレッドシートに出力されます。初回実行時は権限リクエスト画面が表示されますので、実行するアカウントを選択して許可してください。, なお、スクリプトを実行するには「カレンダーの管理」のG Suite権限が必要になりますので、適切な権限を持つユーザーで実行してください。, ずらずらーっと予定の一覧が出力されるはずです。細かい解説はコード内のコメントで記載していますが、基本的に「Google Calendar API」の"Events: list"を呼び出しているだけです。ポイントは"singleEvents: false"を指定すること。これを指定しないと、繰り返し予定がすべて独立した予定として出力されてしまい、APIでの取得数の上限である2500レコードを埋め尽くしてしまいます。(Googleカレンダーの繰り返し予定は終了日が必須ではないので、エンドレスに続きます)ただし"singleEvents: false"を指定するとなぜか"orderBy"が使用できなくなるという謎の仕様なので、ソートはJS側で実装しています。, サンプルのスプレッドシートの列にある情報以外にも取得できるプロパティは沢山ありますので、以下のリファレンスを参考にカスタマイズしてみてください。, 繰り返し予定を出力した場合、「繰り返し条件(recurrence)」に"RRULE~"という文字列が入ってきます。これはRFC5545で定義されているiCalendarの繰り返し条件(Recurrence)の表記です。詳細な説明は省きますが、"RRULE~"という文字列がセットされている予定は「繰り返し予定の大元の予定」だと認識しておけば大丈夫です。逆に「繰り返し予定ID(recurringEventId)」に予定IDがセットされている場合は、「繰り返し予定の中から編集して単独の予定として出力された予定」のレコードとなります。, なお、カレンダー管理権限を持つユーザーで実行すると、対象のユーザーの非公開予定も出力されてしまうので、情報の取り扱いには注意しましょう。, 続いて、複数の予定のプロパティを一括変更するGASを書き足します。今回は「ゲストの予定編集権限(guestsCanModify)をONにする」というサンプルコードにしました。もちろん他のプロパティを変更することも可能なので、お好みにカスタマイズしちゃってください。(特権管理者であれば、主催者を強制的に変更するなんてこともできちゃいます), 先ほど作成したスプレッドシートに、「イベント更新」という名前の新しいシートを追加し、以下のような列を用意します。, 「対象カレンダーID」は予定取得の時と同じように、対象者のカレンダーID(一般ユーザーの場合はメールアドレスと同一)を、「対象イベントID」には更新対象のイベントIDをセットします。イベントIDは先述の予定取得GASで取得した値をそのままコピペするのがいいでしょう。「実行結果」は空欄のままにしておいてください。, スプレッドシートに戻り、「GAS実行」→「イベント更新」を実行すると、対象の予定が上から順に更新されていきます。, 今回はCalendar APIの"Events: patch"を使用して、対象のイベントのプロパティを更新しています。"Events: update"も用意されていますが、patchの方が必要最小限の更新で済むらしいです。実際に違いを試した訳ではないですが…, なお、繰り返し予定を対象にした場合、大元の予定を変更するとそれを元にしているすべての繰り返し予定のプロパティが変更されます。繰り返し予定のうちの特定のイベントのみを変更したい場合は、あらかじめ繰り返し予定の中の予定を編集し、別レコードとして出力された予定を対象にする必要があります。, 今回のサンプルGASをカスタマイズすれば、Googleカレンダーのイベントの様々なプロパティを一括で変更できます。イベントの構造を理解するのが少し大変ですが、リファレンスに説明もありますので、お好みのGASにカスタマイズして快適なGoogleカレンダーライフを送ってください。, 明日は引き続き「情シスSlack Advent Calendar 2019#1」の15日目で2枚抜きにチャレンジです。, //orderBy: "startTime", //"orderBy"は"singleEvents"がtrueでないと使用できない, //まれに予定ではないレコードが含まれるので、"htmlLink"が存在しないレコードはスキップする, //終日予定の場合は"event.start.date"を、通常の予定の場合は"event.start.dateTime"を保持している.