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

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

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

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

Google カレンダー

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

Q&A

2回答

468閲覧

LINEにGoogle カレンダーの予定を1か月分まとめて送りたい

yuka2020

総合スコア2

LINE Messaging API

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

Google カレンダー

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

0グッド

1クリップ

投稿2023/01/16 01:13

前提

Gpogleカレンダーの予定を1か月分LINEに送信したいと考えています。
1週間分をアレンジして1か月分を送信することは可能そうなのですが、
予定のない日も「〇月〇日」とでてしまい、文章が長くなってしまう状況です。
予定がある日だけまとめてピックアップして通知してもらえるようにしたいと考えています。

実現したいこと

1月16日(月)
予定

1月20日(金)
予定

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

予定がない日も 1月20日(金) (空白) と送信されてしまいます。

該当のソースコード

function myFunction(){ var startDate = new Date(); var period = 31; // 予定を表示したい日数 startDate.setDate(startDate.getDate() + 1); var schedule = getSchedule(startDate, period); var message = scheduleToMessage(schedule, startDate, period); sendToLINE(message); } // Googleカレンダーから予定取得 function getSchedule(startDate, period){ var calendarIDs = ['〇〇〇']; //カレンダーIDの配列。カレンダーを共有している場合、複数指定可。 var schedule = new Array(calendarIDs.length); for(var i=0; i<schedule.length; i++){schedule[i] = new Array(period);} for(var iCalendar=0; iCalendar < calendarIDs.length; iCalendar++){ var calendar = CalendarApp.getCalendarById(calendarIDs[iCalendar]); var date = new Date(startDate); for(var iDate=0; iDate < period; iDate++){ schedule[iCalendar][iDate] = getDayEvents(calendar, date); date.setDate(date.getDate() + 1); } } return schedule; } function getDayEvents(calendar, date){ var dayEvents = ""; var events = calendar.getEventsForDay(date); for(var iEvent = 0; iEvent < events.length; iEvent++){ var event = events[iEvent]; var title = event.getTitle(); var startTime = _HHmm(event.getStartTime()); var endTime = _HHmm(event.getEndTime()); dayEvents = dayEvents + '・' + startTime + '-' + endTime + ' ' + title + '\n'; } return dayEvents; } function scheduleToMessage(schedule, startDate, period){ var now = new Date(); var body = '\n1週間の夜や出張の予定です。ご迷惑をお掛けしますが、宜しくお願い致します。\n' + '(' +_Md(now) + ' ' +_HHmm(now) + '時点)\n' + '--------------------\n'; var date = new Date(startDate); for(var iDay=0; iDay < period; iDay++){ body = body + _Md(date) + '(' + _JPdayOfWeek(date) + ')\n'; for(var iCalendar=0; iCalendar < schedule.length; iCalendar++){ body = body + schedule[iCalendar][iDay]; } date.setDate(date.getDate() + 1); body = body + '\n'; } return body; } // LINE通知 function sendToLINE(message){ var token = '〇〇〇'; //LINE Notifyのトークン var options = { "method": "post", "payload": "message=" + message, "headers": {"Authorization" : "Bearer "+ token} }; UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options); } // 日付指定の関数 function _HHmm(date){ return Utilities.formatDate(date, 'JST', 'HH:mm'); } function _Md(date){ return Utilities.formatDate(date, 'JST', 'M/d'); } function _JPdayOfWeek(date){ // date = new Date() var dayStr = ['日', '月', '火', '水', '木', '金', '土']; var dayOfWeek = date.getDay(); return dayStr[dayOfWeek]; }

試したこと

https://www.shanaidx.com/calendar_akijikan/
など空いている日を設定など、引いていけばよいのかと思いましたが、余計に複雑になりました。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

GAS

1function getDayEvents(calendar, date) { 2 var dayEvents = ""; 3 var events = calendar.getEventsForDay(date); 4 5 for (var iEvent = 0; iEvent < events.length; iEvent++) { 6 var event = events[iEvent]; 7 var title = event.getTitle(); 8 var startTime = _HHmm(event.getStartTime()); 9 var endTime = _HHmm(event.getEndTime()); 10 11 if (title == "") { 12 continue; 13 } 14 15 dayEvents = dayEvents + '・' + startTime + '-' + endTime + ' ' + title + '\n'; 16 } 17 18 return dayEvents; 19}

投稿2023/01/19 04:51

penguin520

総合スコア345

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

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

penguin520

2023/01/19 05:00

for文の中に var なり letなりで 宣言するコードをわりとみかけるんですが。 何回も宣言されてもerror起きないんですかね。と思うことがあります。 わたしは、for文の中で変数は宣言しない派です。たぶん、定数宣言するとerror吐くんだろうね、きっと。
penguin520

2023/01/19 05:00

この回答にあるように if (title == "") { continue; } を追加してみてもだめですか??
yuka2020

2023/01/25 04:48

追加してみても、場所も変えてみましたが表示されたままでした。 ``` function scheduleToMessage(schedule, startDate, period){ var now = new Date(); var body = '\n1週間の夜や出張の予定です。ご迷惑をお掛けしますが、宜しくお願い致します。\n' + '(' +_Md(now) + ' ' +_HHmm(now) + '時点)\n' + '--------------------\n'; var date = new Date(startDate); for(var iDay=0; iDay < period; iDay++){ body = body + _Md(date) + '(' + _JPdayOfWeek(date) + ')\n'; for(var iCalendar=0; iCalendar < schedule.length; iCalendar++){ body = body + schedule[iCalendar][iDay]; } date.setDate(date.getDate() + 1); body = body + '\n'; } return body; } ``` でdayが連続で表示されてしまうのでしょうか・・・
penguin520

2023/01/25 05:18

別の質問に答えている途中なので、少し時間ください。
penguin520

2023/01/25 05:57

おまたせしました。 そうですね。 for文で、予定がない日を body = body + _Md(date) + '(' + _JPdayOfWeek(date) + ')\n'; みたいに、空白+改行をいれてるので、予定の入ってない日は改行いれないように処理すればいいのだとは思いますが。 一回、コードを走らせて現象を再現しないと解決できないかなぁと。 コードがすごい長いので、ぱっとみただけで全部予想できないですし。 この件、急ぎですか???
guest

0

内容が空白の日は削除するようにしては。

投稿2023/01/16 02:00

y_waiwai

総合スコア87749

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

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

yuka2020

2023/01/16 02:13

ご指摘ありがとうございます。 コードのどこの時点で削除したらよいのかわからず・・・初心者で申し訳ありません。
y_waiwai

2023/01/16 04:06

その予定の項目が空白かどうかというのは判定できないでしょうか それが空白なら、出力しないようにすればいいです
yuka2020

2023/01/25 04:45

ご返信ありがとうございます。 空白かどうか他の方の回答で出来るということが分かりましたが、その次で出力されてしまうようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問