teratail header banner
teratail header banner
質問するログイン新規登録
Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

3363閲覧

GASを使ってGoogleカレンダーの編集をトリガーに、何の予定が編集されたかを取得したい

junjie-yanqi

総合スコア1

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2021/08/15 02:35

編集2021/08/28 02:58

0

2

前提・実現したいこと

以下URLを参考に、GAS側とGCP側でそれぞれCalendar APIを有効化しています。
・Googleカレンダーの編集をトリガーにして、スプレッドシートの予定も更新したい時の準備メモ
・GASで周期を計算し次のhappeningを予測する話

「該当のソースコード」欄に記載しました、initialSync関数の実行結果が失敗しており、原因と対処方法がどうしても分かりませんでした。
そのため今回アドバイスを頂きたく初投稿させて頂きました。
GAS勉強中の身のため、詳しくご説明くださると大変助かります。
何卒宜しくお願い致します。

発生している問題・エラーメッセージ

Exception: Invalid argument: value
initialSync @ コード.gs:5


Logger.log(nextSyncToken)
→undefinedが返った。

Logger.log(items)
→Logging output too large. Truncating output. {updated=~・・・
(itemsに8192byteの文字列が格納されていた)

該当のソースコード

1 function initialSync() {
2 var items = Calendar.Events.list("XXXXXXX@gmail.com");
3 var nextSyncToken = items.nextSyncToken;
4 var properties = PropertiesService.getScriptProperties();
5 properties.setProperty("syncToken", nextSyncToken);
6 }

試したこと

  • GCPでプロジェクトを本番環境にしてみる→解消せず
  • カレンダーをオープンアクセスにする→解消せず

補足情報(FW/ツールのバージョンなど)

ブラウザはchromeで、Googleのアカウントのみ使用。
使用PCはWindows10です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/08/17 00:58

getSyncTokenって何ですか?
junjie-yanqi

2021/08/28 03:02

すみません「試したこと」の一覧で関係無い内容を入れてしまっていました。 該当部分削除しましたので、getSyncTokenの件は忘れて頂けると幸いです。
guest

回答3

0

nextSyncTokenを取得できたようなので、以下のコードでnextSyncTokenをプロパティサービスに保存出来ると思います。

GAS

1function initialSync(e) { 2 //カレンダーの情報を取得するためのオプション 3 //一回のリクエストで最大2400件取得できる 4 var options = { 5 maxResults: 2400, 6 }; 7 //次のページがある場合オプションに次のページのトークンを設定 8 if (e.nextPageToken) { 9 options.nextPageToken = e.nextPageToken; 10 } 11 //オプションを設定してカレンダー情報を取得 12 var items = Calendar.Events.list(e.calendarId, options); 13 //nextSyncTokenを取得 14 var nextSyncToken = items.nextSyncToken; 15 //nextSyncTokenがあった場合 16 if (nextSyncToken) { 17 console.log(`nextSyncTokenがありました。${nextSyncToken}です。`); 18 //プロパティサービスに情報を保存 19 var properties = PropertiesService.getScriptProperties(); 20 properties.setProperty("syncToken", nextSyncToken); 21 //nextSyncTokenが無く、次のページがあった場合 22 } else if (items.nextPageToken) { 23 //eに次ページのnextPageTokenを設定し、initialSync(e);を再実行 24 e.nextPageToken = items.nextPageToken; 25 initialSync(e); 26 //nextSyncTokenが無く、次のページがない場合終了 27 } else { 28 console.log(`次のページはありません。終了です。`); 29 } 30} 31

投稿2021/09/04 15:34

fake_shibe

総合スコア806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junjie-yanqi

2021/09/05 07:10

ありがとうございます!具体的なコードを記載頂けて助かります!
guest

0

ベストアンサー

var items = Calendar.Events.list("XXXXXXX@gmail.com");

Calendar.Events.listの引数にはcalendarIdを指定しないといけないのでは。

apps-script-samples/calendar.gs at master · googleworkspace/apps-script-samples


追加の回答

syncTokenがセットされていない(過去に一度も自分でセットしていない)からundefinedなのだと思われるので、

  • syncTokenがセットされていない状態を判定して対応する特別処理を入れる
  • とにかく一度syncTokenをセットする処理を行っておくことにする

のいずれかの対応が必要なのかなと思います。

投稿2021/08/28 03:29

編集2021/09/04 08:40
itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junjie-yanqi

2021/08/28 18:22 編集

御回答ありがとうございます。御協力非常に助かります。 引数calendarIdを指定とはどういうことでしょうか? XXXXXXX@gmail.comのX部分はマスクしてますが、実際は私のカレンダーIDで、スプシからGASを実行してGoogleカレンダーへ書き込み等の更新は出来ています。 今度は逆にGoogleカレンダーの編集をトリガーに自動でスプシを更新させたいがinitialSync関数が上手く動かない、というのが背景になります。 おっしゃるように、私もCalendar.Events.listの呼び出しが何故か上手くいっていないのが原因と考えています。
itagagaki

2021/08/29 00:14

calendarIdは正しいのですね。失礼しました。 では、なぜnextSyncTokenがundefinedなのかですね。 時間ができたら私も実験してみて、何かわかったらまた回答します。
junjie-yanqi

2021/08/29 05:30

すみません。何か分かったら教えて頂けると大変うれしいです。回答お待ちしております。
itagagaki

2021/08/29 07:13

単純にsyncTokenがセットされていない(過去に自分でセットしていない)からundefinedなのではないでしょうか。 [GASにGoogleカレンダーのイベント変更検知機能が実装されたので試してみた - Qiita]https://qiita.com/howdy39/items/b92c9ba0b050151a889b
junjie-yanqi

2021/09/04 08:31

仕事の都合で返信遅れました。申し訳ございません。 頂いたURLに記載されているcalendarUpdatedSampleをトリガーに設定してカレンダー変更してみたところ、ログ表示結果は問題無く予定が取れていました。 [Googleカレンダーの編集をトリガーにして、スプレッドシートの予定も更新したい時の準備メモ - Qiita]https://qiita.com/cazimayaa/items/5fdfbc060dff7a11ee15 のとおりの手順だけだと初回はsyncTokenがセットされておらず失敗するので、セットする処理を追加しておく必要があるってことですかね。。。
itagagaki

2021/09/04 08:36

そうですね。syncTokenがセットされていない状態を判定して対応する特別処理を入れるか、もしくは、とにかく一度セットする処理を行っておくことにするか、ですかね。
itagagaki

2021/09/04 08:40

一応回答に追記しておきました。
guest

0

properties.setPropertyにundefinedはセットできないようなので、エラーになっていると思います。
var nextSyncToken = items.nextSyncToken;undefinedということで、以下のコードに書き換えれば動くと思いますがどうでしょう。

GAS

1var nextSyncToken = items.nextSyncToken || "";

投稿2021/08/28 18:20

fake_shibe

総合スコア806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junjie-yanqi

2021/08/28 19:29

御回答ありがとうございます。御協力非常に助かります。 教示頂いたコードで正常に動きました。ただ var nextSyncToken = items.nextSyncToken;がundefinedになってしまう原因と根本対処をしないと、目的であるカレンダーから編集した予定の取得は出来ないと考えております。 考えられる原因はございますでしょうか。
fake_shibe

2021/08/28 19:54

syncTokenというものはカレンダーを編集した時に発行されるようなので、apps scriptでトリガーを設定してから実際に自分でカレンダーを編集してみても駄目でしょうか? トリガーで実行されたものは、Google Apps Scriptの左側にある実行数タブからLogger.log, console.logで確認できます。 自分の場合は以下のスクリプトでテストしてみてnextSyncTokenは表示されました。 function myFunction(e) { console.log(e); var cid = e.calendarId; var items = Calendar.Events.list(cid); var nextSyncToken = items.nextSyncToken; console.log(nextSyncToken); console.log(items); }
junjie-yanqi

2021/08/29 05:29

>apps scriptでトリガーを設定してから実際に自分でカレンダーを編集してみても駄目でしょうか? はい、そちらも試しているのですが同じく駄目な状況です。 今回教示頂いたコードでトリガー設定してカレンダーを編集してみました。 console.log(e)の表示結果↓ { calendarId: 'XXXXXXX@gmail.com', triggerUid: 'XXXXXXX',・・・ console.log(nextSyncToken)の表示結果↓ undefined console.log(items)の表示結果↓ ログ出力のサイズが大きすぎます。出力を切捨てます。 { defaultReminders: [], timeZone: 'Asia/Tokyo',・・・ fake_shibeさんが表示出来て私が出来ていないということは、コード以外の設定に問題がありそうでしょうか。補足として、 https://qiita.com/cazimayaa/items/5fdfbc060dff7a11ee15 の通りに設定していて、その中のonCalendarEditも Logger.log(events)の表示結果↓ ログ出力のサイズが大きすぎます。出力を切捨てます。 {kind=・・・ Logger.log(nextSyncToken)の表示結果↓ null となりエラーになります。
fake_shibe

2021/08/29 19:50

もしかしたら下のコードでnextSyncTokenが見つかるかもしれません。 オプションのmaxResultsで2400件ずつイベントを取得し、 次のページがあるだけ繰り返しています。(nextPageTokenがある場合) function myFunction(e) { var options = { maxResults: 2400, }; if (e.nextPageToken) { options.nextPageToken = e.nextPageToken; } var items = Calendar.Events.list(e.calendarId, options); var nextSyncToken = items.nextSyncToken; console.log(nextSyncToken); //console.log(items); if (nextSyncToken) { console.log(`nextSyncTokenがありました。${nextSyncToken}です。`); } else if (items.nextPageToken) { e.nextPageToken = items.nextPageToken; myFunction(e); } else { console.log(`次のページはありません。終了です。`); } }
junjie-yanqi

2021/09/04 08:04

仕事の都合で返信遅れました。申し訳ございません。 頂いたコードでカレンダーを1件変更してみたところ、以下の結果が返ってきました。 nextSyncTokenがありました。~~~です。 function initialSyncのコードを何かしら修正することで解決出来そうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問