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

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

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

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

Google カレンダー

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

Google API

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

Q&A

1回答

323閲覧

Googleカレンダーの週間予定をLINEに通知 予定をまたぐ場合は次の日に反映されないようにしたい。

KPS

総合スコア8

LINE Messaging API

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

Google カレンダー

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

Google API

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

0グッド

1クリップ

投稿2020/01/19 12:15

GASにてGoogleカレンダー(複数)の予定をLINEに通知をしたいです。
Googleカレンダー取得しLINEに通知は出来ています。

やりたい事
・週間に予定がない時は通知しない。
・日を超える予定は次の日に入れない。
例 19日予定 22:00-8:00の場合 表示は19日のみ(現在は19日と20日に表示されてしまいます。)
・22:00-翌日8:00 の場合 22:00-32:00 の表示にしたい。

今までの参考にして色々やっているのですがうまくいかないのでよろしくお願い致します。

var token = "LINE_TOKEN"; var calendarTitleMap = { "①@group.calendar.google.com" : "①", "②@group.calendar.google.com" : "②", "③@group.calendar.google.com" : "③", "④@group.calendar.google.com" : "④", "⑤@group.calendar.google.com" : "⑤", "⑥@gmail.com" : "⑥", }; var weekday = ["日", "月", "火", "水", "木", "金", "土"]; function notifyWeekly() { var calendars = CalendarApp.getAllCalendars(); var dt = new Date() var message = "週間予定\n\n"; for ( var i = 3; i < 8; i++ ) { dt.setDate(dt.getDate() + 2); message += Utilities.formatDate(dt, 'JST', '★ MM/dd(' + weekday[dt.getDay()] + ')') + "\n"; var dayText = ""; for(j in calendars) { var calendar = calendars[j]; var calendarName = calendarTitleMap[calendar.getId()] if ( calendarName == undefined ) { continue; } var events = calendar.getEventsForDay(dt); if( events.length == 0 ) { continue; } dayText += "< " + calendarName + " >\n"; for(j in events) { dayText += toDayText(events[j]); } dayText += "\n" } if ( dayText == "") { dayText += "予定はありません\n\n"; } message += dayText; } sendToLine(message); } function sendToLine(message){ var options = { "method" : "post", "headers" : {"Authorization" : "Bearer "+ token}, "payload" : "message=" + message }; UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options); } function toDayText(event) { return toTimeText(event.getStartTime()) + ' - ' + toTimeText(event.getEndTime()) + " " + event.getTitle() + '\n'; } function toTimeText(str){ return Utilities.formatDate(str, 'JST', 'HH:mm'); } ``` ![イメージ説明](5056cbb2e3155299f871194f5d875da7.jpeg) ![![イメージ説明](292047e7ded00f419397c5fdfc8b4b25.jpeg)](34349fa610d8cf6d00b3e52a1f762b65.jpeg)

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

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

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

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

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

guest

回答1

0

コードにはやりたいことに挑戦しようとした痕跡がありませんので、具体的な直しが入れられません。

・週間に予定がない時は通知しない。

予定がありません、となったときの個数をかぞえる。7より少ないときのみ通知をする

・日を超える予定は次の日に入れない。

例 19日予定 22:00-8:00の場合 表示は19日のみ(現在は19日と20日に表示されてしまいます。)

開始時間が取得しようとした日であるか判定する。これは過去のコードにてお示ししています。

・22:00-翌日8:00 の場合 22:00-32:00 の表示にしたい。

開始時間と終了時間が同じ日でないとき、日数差✕24を足す。便利機能はないので自力で頑張るしかないです。

javascript

1// 219287 style 2const lineToken = "LINE コード"; 3 4function q219287() { 5 const today = new Date(); 6 const days = [0,1,2,3,4,5,6].map(function (d) { return (new Date()).setDate(today.getDate() + d);}); 7 const events = days.reduce(function (a, c) { 8 const eves = getEvents(c); 9 return eves.length === 0 ? a : a.concat([c, eves]); 10 },[]); 11 if(events.length === 0) { return; } 12 const message = events.map(function (e) { return [toDate(e[0])].concat(e[1].map(eventAsText));}).join("\n"); 13 sendToLine(message); 14} 15 16function getEvents(thedate) { 17 const calendars = { 18 "①@group.calendar.google.com" : "①", 19 "②@group.calendar.google.com" : "②", 20 "③@group.calendar.google.com" : "③", 21 "④@group.calendar.google.com" : "④", 22 "⑤@group.calendar.google.com" : "⑤", 23 "⑥@gmail.com" : "⑥", 24 }; 25 return Object.keys(calendars).map(function (e) { return CalendarApp.getCalendarById(e);}).map(function (cal) { 26 return [calendars[e], getEventsStartsInTheDay(cal, thedate)]; 27 }).filter(function (e) { 28 return e[1].length > 0; 29 }); 30} 31 32function eventAsText(events) { 33 return events.map(function (e) { 34 return '◆ ' + e[0] + '\n' + e[1].map(eventToString).join('\n\n'); 35 }).join('\n'); 36} 37function sendToLine(text) { 38 const token = lineToken; 39 const options = { 40 "method": "post", 41 "payload": "message=" + text, 42 "headers": {"Authorization": "Bearer " + token} 43 }; 44 UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options); 45} 46 47function toTime(targetdate, basedate) { 48 const min = Utilities.formatDate(str, 'JST', "mm"); 49 const hour = Utilities.formatDate(str, 'JST', "HH"); 50 if(targetdate.getDate() === basedate.getDate()) { 51 return hour + ":" + min; 52 } 53 const target = new Date(targetdate.getFullYear(), targetdate.getMonth(), targetdate.getDate()); 54 const base = new Date(basedate.getFullYear(), basedate.getMonth(), basedate.getDate()); 55 const datediff = Math.floor(target - base / 86400000); 56 return ("0" + ((hour - 0) + 24 * datediff)).slice(-2) + ":" + min; 57} 58function toDate(date) { 59 return Utilities.formatDate(dt, 'JST', '★ MM/dd(' + ["日", "月", "火", "水", "木", "金", "土"][date.getDay()] + ')'); 60} 61 62function getEventsStartsInTheDay(calendar, thedate) { 63 const dateNum = thedate.getDate();// 219287 のエラーからすると (new Date(thedate)).getDate(); か。 64 return calendar.getEventsForDay(thedate).filter(function (e) { 65 return e.getStartTime().getDate() === dateNum; 66 }); 67} 68function eventToString(event) { 69 const start = event.getStartTime(); 70 return toTime(start, start) + ' - ' + toTime(event.getEndTime(), start) + '\n ' + event.getTitle() + '\n\n'; 71} 72// 219287 73// 219724 style 74function sendTodaySchedule() { 75 var accessToken = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN'); 76 77 const message = [0,1,2,3,4,5,6].map(function (d) { return getMessage(d);}).filter(function (e) { return e !== "";}).join("\n"); 78 if (!_isNull(message)) { 79 const options = 80 { 81 'method': 'post' 82 , 'payload': 'message=' + message 83 , 'headers': {'Authorization': 'Bearer ' + accessToken} 84 , muteHttpExceptions: true 85 }; 86 UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options); 87 } 88} 89 90function getMessage(prm) { 91 const week = ['日', '月', '火', '水', '木', '金', '土']; 92 93 var arrCals = []; 94 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@gmail.com')); 95 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//① 96 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//② 97 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//③ 98 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//④ 99 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//⑤ 100 101 var date = new Date(); 102 var strHeader = ''; 103 date = new Date(date.getYear(), date.getMonth(), date.getDate() + prm); 104 strHeader += Utilities.formatDate(date, 'JST', 'yyyy/M/d') 105 + '(' + week[date.getDay()] + ') の予定\n'; 106 107 var strBody = getEvents(arrCals, date); 108 //if ( _isNull(strBody) ) strBody = '予定はありません。'; 109 return _isNull(strBody) ? '' : strHeader + strBody; 110} 111 112function getEvents(prmarrCals, prmDate) { 113 var strEvents = ''; 114 var strStart = ''; 115 var strEnd = ''; 116 var strTime = ''; 117 var strLocation = ''; 118 var strDescription = ''; 119 if (!_isNull(prmarrCals)) { 120 for (var j = 0; j < prmarrCals.length; j++) { 121 var currentEvents = ''; 122 var arrEvents = prmarrCals[j].getEventsForDay(new Date(prmDate)); 123 for (var i = 0; i < arrEvents.length; i++) { 124// if (!_isNull(strEvents)) strEvents += '\n'; 125 var starts = arrEvents[i].getStartTime(); 126 if (starts.getDate() !== prmDate.getDate()) continue; 127 strStart = _HHmm(starts); 128 strEnd = toTime(arrEvents[i].getEndTime(), starts); 129 if (strStart === strEnd) { 130 strTime = '終日'; 131 } else { 132 strTime = strStart + '~' + strEnd; 133 } 134 currentEvents += '・' + strTime + '【' + arrEvents[i].getTitle() + '】'; 135 strLocation = arrEvents[i].getLocation(); 136 strDescription = arrEvents[i].getDescription(); 137 if (!_isNull(strLocation)) currentEvents += '\n 場所:' + strLocation; 138 if (!_isNull(strDescription)) currentEvents += '\n 説明:' + strDescription; 139 } 140 if (_isNull(currentEvents)) continue; 141 if (!_isNull(strEvents)) strEvents += '\n'; 142 strEvents += prmarrCals[j].getName() + '\n' + currentEvents; 143 } 144 } 145 return strEvents; 146} 147 148function _HHmm(str) { 149 return Utilities.formatDate(str, 'JST', 'HH:mm'); 150} 151 152function _isNull(prm) { 153 if (prm == '' || prm === null || prm === undefined) { 154 return true; 155 } else { 156 return false; 157 } 158} 159//219724 160//236158 style 161const token = "LINE_TOKEN"; 162 163const calendarTitleMap = { 164 "①@group.calendar.google.com" : "①", 165 "②@group.calendar.google.com" : "②", 166 "③@group.calendar.google.com" : "③", 167 "④@group.calendar.google.com" : "④", 168 "⑤@group.calendar.google.com" : "⑤", 169 "⑥@gmail.com" : "⑥", 170 171}; 172 173const weekday = ["日", "月", "火", "水", "木", "金", "土"]; 174 175function notifyWeekly() { 176 var _counter = 0; 177 const calendars = CalendarApp.getAllCalendars(); 178 var dt = new Date() 179 var message = "週間予定\n\n"; 180 181 for ( var i = 3; i < 8; i++ ) { 182 183 dt.setDate(dt.getDate() + 2); 184 message += Utilities.formatDate(dt, 'JST', '★ MM/dd(' + weekday[dt.getDay()] + ')') + "\n"; 185 186 var dayText = ""; 187 for(j in calendars) { 188 var calendar = calendars[j]; 189 190 var calendarName = calendarTitleMap[calendar.getId()] 191 if ( calendarName == undefined ) { 192 continue; 193 } 194 195 var events = calendar.getEventsForDay(dt); 196 if( events.length == 0 ) { 197 continue; 198 } 199 200 dayText += "< " + calendarName + " >\n"; 201 for(j in events) { 202 var tmp = toDayText(events[j], dt); 203 dayText += tmp === "" ? "" : tmp + "\n"; 204 } 205 //dayText += "\n" 206 } 207 208 if ( dayText == "") { 209 dayText += "予定はありません\n\n"; 210 counter++; 211 } 212 message += dayText; 213 } 214 if(_counter === 5) { return; } 215 sendToLine(message); 216} 217 218function toDayText(event, date) { 219 const st = event.getStartTime(); 220 if(st.getDate() !== date.getDate()) { return ""; } 221 return toTimeText(st) + ' - ' + toTime(event.getEndTime(), st) + " " + event.getTitle() + '\n'; 222} 223 224function toTimeText(str){ 225 return Utilities.formatDate(str, 'JST', 'HH:mm'); 226} 227//236158

3 つにわけようかと思ってたんですが相互に依存する関数があるので 1 回答にしました。219724 のときにおもったんですがよくこれだけ以前の回答がまるでなかったかのような処理を再発明できますよね。感服します。手直ししてて 219724 のコードが動きそうだなーと思いました。

投稿2020/01/19 13:46

編集2020/01/19 15:38
papinianus

総合スコア12705

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

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

KPS

2020/01/19 18:36

回答ありがとうございます。 毎回助かっております。 エラーコードが  TypeError: 変数 weekday の再宣言。 と出てしまいます。 よろしくお願い致します。
natsu.desu

2020/02/01 11:06

横からすいません。 ほとんど同じような質問をしていたので拝見しました。 多分、同じようなサイトを参考にしたとおもいます。 gas初心者なので、今後のためにも完成形を提示して頂けると大変助かりますのでよろしくお願い致します。
papinianus

2020/02/12 03:07

weekday は 1 回しか出現してないように見えますが、そもそもコメントで区切ったブロックは各質問のidに対応しており、それぞれ別の仕事をします。ヘルパ関数を除いて、該当ブロックのみを切り出す必要があります。 >完成形 参考にしたサイトがわからないので、どのコードのことを仰っているのかわかりません。↑でもかきましたが、これまで 3 つの質問で似たような内容のしかしコードは全く別の実装が提示されています。 どの質問のコードを参考にし、どうなるのが完成なのか示していただく必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問