質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google API

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

3300閲覧

【GAS】Googleカレンダにイベントを入力したタイミングでLINEへ自動通知させたいです。

narururu

総合スコア172

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google API

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

JavaScript

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/06/09 12:06

解決したい課題

Googleカレンダにイベントを入力したタイミングでLINEへ自動通知させたいです。

試したこと

↓以下のサイトを基にコードコピペ????(絵文字の一部とBitlyは削除)
https://qiita.com/ara1yu81/items/04e7b730f9af1def2ea9

function myFunction(event) { // カレンダーIDのの取得 var calendarId = event.calendarId; // 前回実行時に取得したカレンダーTokenの取得 var token = getSyncToken(calendarId) // カレンダーは更新される毎にTokenを発行している // 引数に渡したToken以降に更新された予定を取得 // イベント毎に実行されるScriptなので最新の1件のイベントが取得される想定 var events = Calendar.Events.list(calendarId, {'syncToken': token}); // ステータスを見て登録、もしくは更新の予定のみにフィルタリング var filteredItems = events.items.filter(function(e){return e.status == "confirmed"}) // 予定をLINEに通知する filteredItems.forEach(function(e){postMessage(e)}); // 今回のTokenを保存する(次回のScript実行時に利用) saveSyncToken(events.nextSyncToken); } /** * 受け取ったイベントからメッセージを出力する * メッセージ内容によって、出力する日付などの加工が必要 * **/ function postMessage(event){ // 表示用の置き時計の絵文字 const emoticonClock = "\uDBC0\uDC71" // 通知用のメッセージを生成 // 時間指定の予定と終日予定の情報差を無くしている // カレンダーのURLが長いので短縮している var message = "\n" + "" + event.summary + "\n" + emoticonClock + calcStartDate(event) + " 〜 " + calcEndDate(event) + "\n" + "カレンダーで見る(" + getShortUrl(event.htmlLink) + ")" // LINE Notifyを利用するにあたって、発行したTokenをHeaderにセットして指定のエンドポイントにPOSTする const url = "https://notify-api.line.me/api/notify"; var headers = { 'Authorization': "Bearer " + PropertiesService.getScriptProperties().getProperty('LINE_BOT_TOKEN') }; var payload = {"message" : message}; var params = { "headers" : headers, "method" : "post", "payload" : payload }; UrlFetchApp.fetch(url, params); } // 前回保存したカレンダーのSyncTokenを取り出す、前回保存分が無い場合は今回のSyncTokenを利用する function getSyncToken(calendarId){ var token = PropertiesService.getScriptProperties().getProperty('SYNC_TOKEN'); if(token){ return token; } var events = Calendar.Events.list(calendarId, {'timeMin': (new Date()).toISOString()}); return events.nextSyncToken; } // SyncTokenをプロパティに保存する function saveSyncToken(token){ PropertiesService.getScriptProperties().setProperty('SYNC_TOKEN', token); } // 開始日時を取得 (予定が終日の場合は開始日時を0時0分とする) function calcStartDate(e){ var str if('dateTime' in e.start){ str = e.start.dateTime } if('date' in e.start){ str = e.start.date + 'T00:00:00+09:00' } return Utilities.formatDate(new Date(str), 'Asia/Tokyo', 'MM/dd HH:mm') } // 終了日を取得 (予定が終日の場合は終了日時を当日の23時59分とする) function calcEndDate(e){ var str if('dateTime' in e.end){ str = e.end.dateTime } if('date' in e.end){ str = e.end.date + 'T00:00:00+09:00' } var datetime = new Date(str) datetime.setMinutes(-1) return Utilities.formatDate(datetime, 'Asia/Tokyo', 'MM/dd HH:mm') }

現状

◇設定項目(参考サイトの手順)

・準備
①LINEで対象のグループチャット用Token発行
→完了
※ただし「連携中のサービス一覧にトークルーム名が並ぶはずです」の記載は?よくわかりませんでした。

②通知用のユーザをグループに招待します。
→完了

③Googleカレンダーのトリガーを設定
→完了

・実装
①カレンダー用のAPI利用設定
→完了

②環境変数の設定
→1のLINENotifyは完了。2のBitlyは任意。3のカレンダーTokenは不要とのことで何もしてない。

③Script
→完了

④デモです。
→Googleカレンダに予定を入れましたが、LINEメッセージが届きません。
※コードは保存できていますので、エラーはない認識です。

不明点

サイトに書かれている通りに実装したつもりです。
なぜ通知されないのか原因がわかりません。

どうしても実装したい!と思ていろいろとトライしておりますが、結果、LINEには届かず。。。
ご存知の方、アドバイスをいただけないでしょうか。
よろしくお願いいたします!

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

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

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

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

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

draq

2020/06/09 12:40

まずはどこまで動いているかログ出力を追加して確認してください。 ①カレンダー更新時にmyFunctionは呼ばれているか。 ②更新したイベント情報は取得できているか。 ③スクリプトプロパティにSyncTokenは保存されているか。 ④LINE通知のUrlFetchApp.fetch()のステータスコードは200が返っているか。200じゃなければbodyの内容にエラーの内容が入っているはずです。 ⑤そもそも実行時エラーになってないか。
narururu

2020/06/09 12:50

ご回答ありがとうございます。draqさん☺ GASの関数を選択するところで何も選択できていませんでした。。大変申し訳ございません。 先程、myFunctionで関数を実行したところ、 TypeError: Cannot read property 'calendarId' of undefined が出力されました。トラシューがんばります。
draq

2020/06/09 12:55

myFunction を直接実行したら引数の event は undefined なのでエラーになるのは当たり前です。
narururu

2020/06/09 13:08

えへへ、そうですよね。ちゃんと見てなかたです。 カレンダIDを変数に入れて、不要なコードは削除しました。 そしたら、ちゃんとLINEに届くようになりました!バンザイ アドバイスありがとうございました????!
guest

回答2

0

質問に質問なので恐縮なのですが、 上記と同じコードを使用したくGASで作成してみたのですがうまく動かないです。

エラーとしては
ReferenceError: Calendar is not defined
getSyncToken @ コード.gs:64
myFunction @ コード.gs:8

実行した際にこのようなエラーが出るのは何が原因と考えられるでしょうか。もし解決できるようでしたら教えていただきたく。

カレンダーは
var calendarId = "カレンダID"にしています。

投稿2022/07/31 06:27

zutty

総合スコア14

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

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

0

自己解決

下記2点の対応で解決しました。

・以下のコード追加。
var calendarId = 'カレンダID';

・以下のコード削除。
"カレンダーで見る(" + getShortUrl(event.htmlLink) + ")"

投稿2020/06/09 13:10

narururu

総合スコア172

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問