🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

Q&A

2回答

924閲覧

【GAS】Googleカレンダーの予定をLINEに通知

ryu01212008

総合スコア26

Google Apps Script

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

0グッド

1クリップ

投稿2019/09/18 19:30

実現したいこと

①Googleカレンダーの予定をLINEに通知
②Google Todoのリストをカレンダーの通知と一緒にLINEに通知したい

①でうまくいっていないく、
別の方法で②も一緒に試しましたが、それぞれ壁にぶち当たりまして困っています。
皆様のお力を貸してください。
情報が不足していたら何なりと仰ってください。

何卒、宜しくお願い致します。

①の該当のソースコード

GoogleAppsScript

1function sendTodaySchedule() { 2 var accessToken = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN'); 3 // 引数により取得する日付を変えられるようにしたいので、 4 // 今日から何日後かを渡すようにします。 5 var message = getMessage(0); 6 var options = 7 { 8 'method' : 'post' 9 ,'payload' : 'message=' + message 10 ,'headers' : {'Authorization' : 'Bearer '+ accessToken} 11 ,muteHttpExceptions:true 12 }; 13 UrlFetchApp.fetch('https://notify-api.line.me/api/notify',options); 14} 15 16/** 17* メッセージ内容取得 18* @param {number} 今日起算の日数 19* @return {string} メッセージ内容 20*/ 21function getMessage(prm) { 22 const week = ['日','月','火','水','木','金','土']; 23 var cal = CalendarApp.getCalendarById('xxxxxxxxx@gmail.com'); 24 var date = new Date(); 25 var strBody = ''; 26 var strHeader = ''; 27 // タイトル 28 if ( prm==0 ) { 29 strHeader = '今日 '; 30 } else if ( prm==1 ) { 31 strHeader = '明日 '; 32 } 33 date = new Date(date.getYear(),date.getMonth(),date.getDate() + prm); 34 strHeader += Utilities.formatDate(date,'JST','yyyy/M/d') 35 + '(' +week[date.getDay()] + ') の予定\n'; 36 // 内容 37 strBody = getEvents(cal,date); 38 if ( _isNull(strBody) ) strBody = '予定はありません。'; 39 return strHeader + strBody; 40} 41 42/** 43* カレンダーイベント内容取得 44* @param {object} カレンダー 45* @param {date} 日付 46* @return {string} イベント内容 47*/ 48function getEvents(prmCal,prmDate) { 49 var strEvents = ''; 50 var strStart = ''; 51 var strEnd = ''; 52 var strTime = ''; 53 var strLocation = ''; 54 var strDescription = ''; 55 if ( !_isNull(prmCal) ) { 56 var arrEvents = prmCal.getEventsForDay(new Date(prmDate)); 57 for (var i=0; i<arrEvents.length; i++) { 58 if ( !_isNull(strEvents) ) strEvents += '\n'; 59 strStart = _HHmm(arrEvents[i].getStartTime()); 60 strEnd = _HHmm(arrEvents[i].getEndTime()); 61 if ( strStart===strEnd ) { 62 strTime = '終日'; 63 } else { 64 strTime = strStart + '~' + strEnd; 65 } 66 strEvents += '・' + strTime + '【' + arrEvents[i].getTitle() + '】'; 67 strLocation = arrEvents[i].getLocation(); 68 strDescription = arrEvents[i].getDescription(); 69 if ( !_isNull(strLocation) ) strEvents += '\n 場所:' + strLocation; 70 if ( !_isNull(strDescription) ) strEvents += '\n 説明:' + strDescription; 71 } 72 } 73 return strEvents; 74} 75/** 76* 時刻フォーマット 77*/ 78function _HHmm(str){ 79 return Utilities.formatDate(str,'JST','HH:mm'); 80} 81/** 82* NULL判定 83* @param {object} 判定対象 84* @return {bool} NULLの場合TRUE 85*/ 86function _isNull(prm) { 87 if ( prm=='' || prm===null || prm===undefined ) { 88 return true; 89 } else { 90 return false; 91 } 92} 93 94function sendTomorrowSchedule() { 95 var accessToken = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN'); 96 // getMessage()の引数を1にするだけです。 97 // 明後日なら3、1週間後なら7にすれば該当するイベント情報を取得できます。 98 var message = getMessage(1); 99 var options = 100 { 101 'method' : 'post' 102 ,'payload' : 'message=' + message 103 ,'headers' : {'Authorization' : 'Bearer '+ accessToken} 104 ,muteHttpExceptions:true 105 }; 106 UrlFetchApp.fetch('https://notify-api.line.me/api/notify',options); 107}

①の設定項目

・ Gメールのアドレスの設置 ・ LINEトークンを下記手順で設定  ファイル > プロジェクトのプロパティ > スクリプトのプロパティ > 行を追加 > LINEトークンを入力 > 保存

①で発生している問題

下記のエラーのみが発生しているようです。
これを解決する方法を教えてください。

メソッド formatDate((class),string,string) が見つかりません。(行 79、ファイル「コード」)

別の方法で試したコード

下記のコードを利用して、①と②を一緒に実現しようと思って試しましたが、こちらもうまくいきませんでした。

GoogleAppsScript

1var lineToken = " ライントークンID "; 2 3function myFunction() { 4 var calendars = CalendarApp.getAllCalendars(); 5 var text = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd') + "\n"; 6 7 //Calender 8 for(i in calendars) { 9 var calendar = calendars[i]; 10 var events = calendar.getEventsForDay(new Date()); 11 12 for(j in events) { 13 var event = events[j]; 14 var title = event.getTitle(); 15 var start = toTime(event.getStartTime()); 16 var end = toTime(event.getEndTime()); 17 text += start + ' - ' + end + " " + title + '\n'; 18 } 19 20 if( events.length > 0 ) { 21 text += "\n"; 22 } 23 } 24 //sendToLine(text); 25 26 //Todo List 27 var myTaskLists = getTaskLists(); 28 var myTasks = getTasks( myTaskLists[0].id ); 29 var msg = "[Todo List]\n"; 30 31 Logger.log( myTasks ); 32 /*myTask[0].titleの配列を変更することで他のリストに変更することができる。*/ 33 Logger.log( myTasks[0].title ); // = "first todo" 34 35 for(i in myTasks){ 36 msg += myTasks[i].title + "\n"; 37 } 38 text +=msg; 39 sendToLine(text); 40} 41 42function sendToLine(text){ 43 var token = lineToken; 44 var options = 45 { 46 "method" : "post", 47 "payload" : "message=" + text, 48 "headers" : {"Authorization" : "Bearer "+ token} 49 50 }; 51 UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options); 52} 53 54function toTime(str){ 55 return Utilities.formatDate(str, 'JST', 'HH:mm'); 56} 57 58function getTaskLists() { 59 var taskLists = Tasks.Tasklists.list().getItems(); 60 if (!taskLists) { 61 return []; 62 } 63 return taskLists.map(function(taskList) { 64 return { 65 id: taskList.getId(), 66 name: taskList.getTitle() 67 }; 68 }); 69} 70 71function getTasks(taskListId) { 72 var tasks = Tasks.Tasks.list(taskListId).getItems(); 73 if (!tasks) { 74 return []; 75 } 76 return tasks.map(function(task) { 77 return { 78 id: task.getId(), 79 title: task.getTitle(), 80 notes: task.getNotes(), 81 completed: Boolean(task.getCompleted()) 82 }; 83 }).filter(function(task) { 84 return task.title; 85 }); 86} 87

こちらのエラーは下記のように出てしまいました。

https://notify-api.line.me のリクエストに失敗しました(エラー: 401)。サーバー応答の一部: {"status":401,"message":"Invalid access token"}(応答の全文を見るには muteHttpExceptions オプションを使用してください)(行 51、ファイル「コード」)

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

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

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

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

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

guest

回答2

0

①のエラー行数的に_HHmmですかね?
だとするとarrEvents[i].getStartTime()arrEvents[i].getEndTime()Date以外が返っているような感じですかね。

Logger.log(str); return Utilities.formatDate(str, 'JST', 'HH:mm');

上記ログを追加して、エラーが出る直前のstrの内容を確認してみてください。


②は、トークンエラーなので、冒頭の

var lineToken = " ライントークンID ";

このライントークンIDが間違ってるのかなぁ。

投稿2019/09/19 00:35

macaron_xxx

総合スコア3191

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

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

ryu01212008

2019/09/19 04:51

①のstrの内容はundefinedになっていました。
macaron_xxx

2019/09/19 07:31

undefinedになることがあるのですね。 私の方でも様々試してみましたが、undefinedになることが再現できませんでした。 下記のあたりで原因になっているカレンダーのイベントを特定してみてください。 Logger.log(arrEvents[i].getTitle()); strStart = _HHmm(arrEvents[i].getStartTime()); strEnd = _HHmm(arrEvents[i].getEndTime());
guest

0

①の該当のソースコード

diff

1 2- var accessToken = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN'); 3 4+ var properties = PropertiesService.getScriptProperties(); 5+ properties.setProperty("LINE_TOKEN", "xxxxxx"); 6+ var accessToken = properties.getProperty("LINE_TOKEN"); 7

試してみたところ、上記の変更のみで実際に動作しました。

投稿2019/09/18 20:55

nullpot

総合スコア153

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

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

nullpot

2019/09/18 21:04

すみません、回答が雑だったので補足します。 > "message":"Invalid access token と表示されていたので、accessTokenに正常に値が入っていないことが推察されました。そのため、回答のコードにより値を定義し、動作を確認しました。 なお、オブジェクトに値が入っているかは ``` Logger.log(accessToken) ``` にて確認が取れますのでご参考までに。
ryu01212008

2019/09/18 21:18

properties.setProperty("LINE_TOKEN", "xxxxxx"); このxxxxxxはなにを入れれば良いのでしょうか?
macaron_xxx

2019/09/19 00:05

この変更は全くの無意味です。 実践しないでくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問