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

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

詳細はこちら
LINE Messaging API

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

Google カレンダー

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

2回答

1337閲覧

gas で複数のカレンダーの予定(今日、明日)の分をLINEで通知する。

KPS

総合スコア8

LINE Messaging API

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

Google カレンダー

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

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2019/10/28 01:42

LINEに複数のGoogleカレンダーの予定(今日、明日)を通知したいのですが、エラーが出てしまうので解決方法を教えていただけませんか?
トリガーにて朝6:00に通知予定。


・夜勤 20:00-9:00 今日の予定には通知するが、明日の予定には通知しない。

今日、明日の予定がない場合はLINEで通知しない

使用する関数も教えてください。
GAS初心者なのでよろしくお願い致します

function sendTodaySchedule() {
var accessToken = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN');

var message = getMessage(0);
var options =
{
'method' : 'post'
,'payload' : 'message=' + message
,'headers' : {'Authorization' : 'Bearer '+ accessToken}
,muteHttpExceptions:true
};
UrlFetchApp.fetch('https://notify-api.line.me/api/notify',options);
}

function getMessage(prm) {
const week = ['日','月','火','水','木','金','土'];

var arrCals = [];
arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@gmail.com'));
arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//①
arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//②
arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//③
arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//④
arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//⑤

var date = new Date();
var strBody = '';
var strHeader = '';
// タイトル
if ( prm==0 ) {
strHeader = '今日 ';
} else if ( prm==1 ) {
strHeader = '明日 ';
}
date = new Date(date.getYear(),date.getMonth(),date.getDate() + prm);
strHeader += Utilities.formatDate(date,'JST','yyyy/M/d')
+ '(' +week[date.getDay()] + ') の予定\n';

strBody = getEvents(arrCals,date);
if ( _isNull(strBody) ) strBody = '予定はありません。';
return strHeader + strBody;
}

function getEvents(prmarrCals,prmDate) {
var strEvents = '';
var strStart = '';
var strEnd = '';
var strTime = '';
var strLocation = '';
var strDescription = '';
if ( !_isNull(prmarrCals) ) {
var arrEvents = prmarrCals.getEventsForDay(new Date(prmDate));arrCals.getEventsForDay(new Date(prmDate));
for (var i=0; i<arrEvents.length; i++) {
if ( !_isNull(strEvents) ) strEvents += '\n';
strStart = _HHmm(arrEvents[i].getStartTime());
strEnd = _HHmm(arrEvents[i].getEndTime());
if ( strStart===strEnd ) {
strTime = '終日';
} else {
strTime = strStart + '~' + strEnd;
}
strEvents += '・' + strTime + '【' + arrEvents[i].getTitle() + '】';
strLocation = arrEvents[i].getLocation();
strDescription = arrEvents[i].getDescription();
if ( !_isNull(strLocation) ) strEvents += '\n 場所:' + strLocation;
if ( !_isNull(strDescription) ) strEvents += '\n 説明:' + strDescription;
}
}
return strEvents;
}

function _HHmm(str){
return Utilities.formatDate(str,'JST','HH:mm');
}

function _isNull(prm) {
if ( prm=='' || prm===null || prm===undefined ) {
return true;
} else {
return false;
}
}

LINEトークンはファイルから入力しています

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

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

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

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

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

macaron_xxx

2019/10/28 08:36

前回の質問と重複しています。 削除してください。
guest

回答2

0

ベストアンサー

このコードを直すならこうかなと思います。全部は、というかメッセージを作るとこはみてないです。forのなかで文字列を錬成するなんていうのはロストテクノロジーなんで、私みたいなレベルの低い人間には分かりません。

javascript

1function sendTodaySchedule() { 2 var accessToken = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN'); 3 4 var message = getMessage(0); 5 if (!_isNull(message)) { 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 message = getMessage(1) || ''; 16 if (!_isNull(message)) { 17 var options = 18 { 19 'method': 'post' 20 , 'payload': 'message=' + message 21 , 'headers': {'Authorization': 'Bearer ' + accessToken} 22 , muteHttpExceptions: true 23 }; 24 UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options); 25 } 26} 27 28function getMessage(prm) { 29 const week = ['日', '月', '火', '水', '木', '金', '土']; 30 31 var arrCals = []; 32 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@gmail.com')); 33 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//① 34 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//② 35 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//③ 36 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//④ 37 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//⑤ 38 39 var date = new Date(); 40 var strHeader = ''; 41// タイトル 42 if (prm == 0) { 43 strHeader = '今日 '; 44 } else if (prm == 1) { 45 strHeader = '明日 '; 46 } 47 date = new Date(date.getYear(), date.getMonth(), date.getDate() + prm); 48 strHeader += Utilities.formatDate(date, 'JST', 'yyyy/M/d') 49 + '(' + week[date.getDay()] + ') の予定\n'; 50 51 var strBody = getEvents(arrCals, date); 52 //if ( _isNull(strBody) ) strBody = '予定はありません。'; 53 return _isNull(strBody) ? '' : strHeader + strBody; 54} 55 56function getEvents(prmarrCals, prmDate) { 57 var strEvents = ''; 58 var strStart = ''; 59 var strEnd = ''; 60 var strTime = ''; 61 var strLocation = ''; 62 var strDescription = ''; 63 if (!_isNull(prmarrCals)) { 64 for (var j = 0; j < prmarrCals.length; j++) { 65 var currentEvents = ''; 66 var arrEvents = prmarrCals[j].getEventsForDay(new Date(prmDate)); 67 for (var i = 0; i < arrEvents.length; i++) { 68// if (!_isNull(strEvents)) strEvents += '\n'; 69 var starts = arrEvents[i].getStartTime(); 70 if (starts.getDate() !== prmDate.getDate()) continue; 71 strStart = _HHmm(starts); 72 strEnd = _HHmm(arrEvents[i].getEndTime()); 73 if (strStart === strEnd) { 74 strTime = '終日'; 75 } else { 76 strTime = strStart + '~' + strEnd; 77 } 78 currentEvents += '・' + strTime + '【' + arrEvents[i].getTitle() + '】'; 79 strLocation = arrEvents[i].getLocation(); 80 strDescription = arrEvents[i].getDescription(); 81 if (!_isNull(strLocation)) currentEvents += '\n 場所:' + strLocation; 82 if (!_isNull(strDescription)) currentEvents += '\n 説明:' + strDescription; 83 } 84 if (_isNull(currentEvents)) continue; 85 if (!_isNull(strEvents)) strEvents += '\n';// 86 strEvents += prmarrCals[j].getName() + '\n' + currentEvents;// 87 } 88 } 89 return strEvents; 90} 91 92function _HHmm(str) { 93 return Utilities.formatDate(str, 'JST', 'HH:mm'); 94} 95 96function _isNull(prm) { 97 if (prm == '' || prm === null || prm === undefined) { 98 return true; 99 } else { 100 return false; 101 } 102}

投稿2019/10/28 14:04

編集2019/11/04 15:17
papinianus

総合スコア12705

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

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

KPS

2019/10/29 02:00

ありがとうございます。 本当に助かっています。 時間の前にカレンダーネームをを入れたいのですが、どこにコードを入れればよいですか? よろしくお願いいたします。
papinianus

2019/10/29 14:04

こっちなら動作するということでいいですかね?それによって過去質問はもう無視できるわけで状況の共有は今後ともお願いしたいです。コードを更新いたしておきます。
papinianus

2019/10/29 14:10

更新しました。現状より上手くいっているどちらかの質問だけ進めてください。
KPS

2019/10/31 01:16

こちらの質問を進めたいのでよろしくお願いいたします。 エラーは ReferenceError: 「_isNull」が定義されていません。(行 7、ファイル「コード」) if(!_isNull(message)) { すいませんが、よろしくお願いいたします。
KPS

2019/10/31 01:50

解決できました。 ありがとうございました。 理想の物になりました。 長い貴重な時間をお付き合いいただき本当にありがとうございました。
dpprecidte

2019/10/31 22:38

参考にさせていただいてます。 papinianusさん 予定がない時は通知しないコードは追加可能でしょうか?
papinianus

2019/11/01 10:43

> 予定がないときは 質問者様に前の質問でも同じこと言われたんですが、そうしているつもりです。確かに検証していませんしバグはあると思いますが、どうバグっているか教えていただけないですか?
dpprecidte

2019/11/01 22:37

申し訳ありません。 質問の仕方が悪かってです。 正常に動くのですが。 全てのカレンダーに予定がない時はLINEには通知をしない(送信しない)用にしたいのです。 よろしくお願い致します。
papinianus

2019/11/03 00:15 編集

私も失礼でした。 改めて伺います。ラインのアカウントをもってないので私は確認できません。 予定がないとき何が送信されるのですか?
papinianus

2019/11/04 15:18

改めて申しあげますが、forの中で文字列を錬成するなんていうのはロストテクノロジーなんで私レベルでは直し切れないです。
guest

0

var

1 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@gmail.com')); 2 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//① 3 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//② 4 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//③ 5 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//④ 6 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//⑤ 7コード

ありがとうございます。
予定がない時はカレンダーネームだけが送信されてきます。

この質問を途中から閲覧させて頂いてますが、前回のコードの時は予定がなければ、何も通知されませんでした。
前回のコードのように何もなければ通知をされないようにしたいのでよろしくお願い致します。

投稿2019/11/03 02:10

dpprecidte

総合スコア8

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

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

dpprecidte

2019/11/07 01:14

ありがとうございました。 無事に出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問