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

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

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

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

3677閲覧

LINE Bot 日時選択アクションを今あるBOTに追加実装したい (引用記事あり)

SA-KYO

総合スコア37

LINE Messaging API

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

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2021/08/23 07:32

編集2021/08/24 03:26

前提・実現したいこと

LINE公式ドキュメントを参考にGASを使って「日時選択アクション」の
APIをを用いて現在あるBOTに日時選択アクションを実装したいです。

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

公式ドキュメントや 引用記事を参考にしましたが どのように実装していけば良いのか 路頭に迷っております。 色々、記述を書き換えてみましたが うまく動作しません、、、

該当のソースコード

if (type === null) { //予定の追加 if (messageText === "予定の追加") { cache.put("type", 1); //開始日時の質問 replyPlans(replyToken, "予定日をいずれかの形式で教えてください!", "【 06/18 】or【 6月18日 】", "などの形式なら大丈夫です!"); //今日、7日間の予定の取得 } else if (messageText.match("今日の予定")) { reply(replyToken, getEvents()); } else if (messageText.match("今週の予定")) { reply(replyToken, notifyWeekly()); } else { //処理方法の返答 replyPlans(replyToken, "「予定の追加」で予定追加します", "「今日の予定」で今日の予定をお知らせします。", "「今週の予定」で7日間の予定をお知らせします!"); } } else { //キャンセル処理 if (messageText === "キャンセル") { cache.remove("type"); reply(replyToken, "予定追加のキャンセルをしました"); return; } switch(type) { case "1": // 開始日時の追加 if ( messageText.match(dateExp)) { var [matched, start_month, start_day] = messageText.match(dateExp); cache.put("type", 2); cache.put("start_month", start_month); cache.put("start_day", start_day); //終了日時の質問 var year = new Date().getFullYear(); //var year = 2020; var startDate = new Date(year, cache.get("start_month") - 1, cache.get("start_day")); reply(replyToken,"予定日は\n" + EventFormat(startDate) + "\nですね!\n\n次に予定終了日をお知らせください。"); break; }else{ reply(replyToken, "予定追加処理中です。\n「キャンセル」\nで追加作業をキャンセルします。"); break; } case "2": // 終了日時の追加 if ( messageText.match(dateExp)) { var [matched, end_month, end_day] = messageText.match(dateExp); cache.put("type", 3); cache.put("end_month", end_month); cache.put("end_day", end_day); //予定名の質問 var year = new Date().getFullYear(); //var year = 2020; var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day")); reply(replyToken,"予定終了日は\n" + EventFormat(endDate) + "\nですね。\n\n最後に予定名を教えてください。"); break; }else{ reply(replyToken, "予定追加処理中です。\n「キャンセル」\nで追加作業をキャンセルします。"); break; } case "3": // 最終確認 cache.put("type", 4); cache.put("title", messageText); var [title, startDate, endDate] = createData(cache); //予定追加の確認 replyPlans(replyToken, "【予定名】:" + title, "予定日:\n" + EventFormat(startDate)+ "\n予定終了日:\n" + EventFormat(new Date(endDate.setDate(endDate.getDate() - 1))), "予定を追加しますか?\n「はい」か「いいえ」でお知らせください。"); break; case "4": if (messageText === "はい") { cache.remove("type"); var [title, startDate, endDate] = createData(cache); CalendarApp.getDefaultCalendar().createAllDayEvent(title, startDate, endDate); reply(replyToken, "予定を追加しました"); } else if (messageText === "いいえ") { cache.remove("type"); reply(replyToken, "予定の追加をキャンセルしました。"); } else{ reply(replyToken, "「はい」か「いいで」でお答えください。"); break; } break; } } } function createData(cache) { var year = new Date().getFullYear(); //var year = 2020; var title = cache.get("title"); var startDate = new Date(year, cache.get("start_month") - 1, cache.get("start_day")); var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day")); endDate = new Date(endDate.setDate(endDate.getDate() + 1)); return [title, startDate, endDate]; } function EventFormat(Date) { var y = Date.getFullYear(); var m = Date.getMonth() + 1; var d = Date.getDate(); var w = Date.getDay(); var weekname = ['日', '月', '火', '水', '木', '金', '土']; m = ('0' + m).slice(-2); d = ('0' + d).slice(-2); return y + '年' + m + '月' + d + '日 (' + weekname[w] + ')\n'; } function replyPlans(replyToken, message, message2, message3) { var url = "https://api.line.me/v2/bot/message/reply"; UrlFetchApp.fetch(url, { "headers": { "Content-Type": "application/json; charset=UTF-8", "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN, }, "method": "post", "payload": JSON.stringify({ "replyToken": replyToken, "messages": [{ "type": "text", "text": message, },{ "type": "text", "text": message2, },{ "type": "text", "text": message3, }], }), }); return ContentService.createTextOutput(JSON.stringify({"content": "post ok"})).setMimeType(ContentService.MimeType.JSON); } function reply(replyToken, message) { var url = "https://api.line.me/v2/bot/message/reply"; UrlFetchApp.fetch(url, { "headers": { "Content-Type": "application/json; charset=UTF-8", "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN, }, "method": "post", "payload": JSON.stringify({ "replyToken": replyToken, "messages": [{ "type": "text", "text": message, }], }), }); return ContentService.createTextOutput(JSON.stringify({"content": "post ok"})).setMimeType(ContentService.MimeType.JSON); } } function HmFormat(date){ return Utilities.formatDate(date, "JST", "HH:mm"); }

補足情報(引用記事になります!)

引用記事はこちらになります!
https://arukayies.com/gas/line_bot/datetime-picker-action

公式ドキュメントはこちら
https://developers.line.biz/ja/reference/messaging-api/#uri-action

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/24 03:24

createData関数が動かないコードになっていますが、ここもわからないということでしょうか?
SA-KYO

2021/08/24 03:28

ご回答ありがとうございます。 すみません!コートの記述を色々試していたもので そのまま載せてしましました、、、 修正させていただいております! createData関数の関しましては ご教授いただきましたおかげで 理解ができました!ありがとうございました。 今回の件も申し訳ありませんが ご教授いただけると幸いです????‍♂️
guest

回答1

0

ベストアンサー

下記のコード例では、datetime picker表示用に新たにpushDatePickerという関数を作っています。

日付を質問する時は、この関数に、表示させたいメッセージと一緒にリプライトークンを渡すようにします。

js

1 //開始日時の質問 2 pushDatePicker("開始日を入力してください", replyToken);

ユーザーがdatetime pickerを利用して日付を入力したときにGASに返ってくるデータは、リプライデータと構造が異なるため、冒頭で条件分岐しています。
datetime picker経由で入力されたデータか否かは、イベントタイプがpostbackかどうかで判断できます。
(ここでは、イベントタイプが"postback"であれば datetime picker経由で入力されたデータ
そうでなければ、通常のリプライデータ)

js

1 var messageText = ""; 2 if (eventtype == "postback") { 3 messageText = event.postback.params.datetime; 4 } else { 5 messageText = event.message.text; 6 }

また、datetime pickerを利用して入力された日付時刻データは「2021-08-24T12:34」のような形式になっているため
この形式にマッチするように正規表現のパターンも変えておく必要があります。

js

1var dateExp2 = /(\d+)-(\d+)T\d+:\d+/;

pushDatePicker関数で記事のコードから変えたのは、
・初期値を現在日時とするようにした。 ("initial": Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy-MM-dd'T'HH:mm"),)
・メッセージを変数にした
・最大・最小は不要なのでコメントアウト
等です。


全体は下記のようになります。

js

1var dateExp2 = /(\d+)-(\d+)T\d+:\d+/; 2 34 5//受け取ったメッセージの処理 6function doPost(e) { 7 var event = JSON.parse(e.postData.contents).events[0] 8 var replyToken = event.replyToken; 9 var eventtype = event.type; 10 if (typeof replyToken === 'undefined') { 11 return; 12 } 13 var messageText = ""; 14 if (eventtype == "postback") { 15 messageText = event.postback.params.datetime; 16 } else { 17 messageText = event.message.text; 18 } 19 var cache = CacheService.getScriptCache(); 20 var type = cache.get("type"); 21 22 if (type === null) { 23 //予定の追加 24 if (messageText === "予定の追加") { 25 cache.put("type", 1); 26 //開始日時の質問 27 pushDatePicker("開始日を入力してください", replyToken); 28 //今日、7日間の予定の取得 29 } else if (messageText.match("今日の予定")) { 30 reply(replyToken, getEvents()); 31 } else if (messageText.match("今週の予定")) { 32 reply(replyToken, notifyWeekly()); 33 } else { 34 //処理方法 の返答 35 replyPlans(replyToken, "「予定の追加」で予定追加します。", "「今日の予定」で今日の予定をお知らせします。", "「今週の予定」で7日間の予定をお知らせします。"); 36 } 37 } else { 38 //キャンセル処理 39 if (messageText === "キャンセル") { 40 cache.remove("type"); 41 reply(replyToken, "予定追加のキャンセルをしました"); 42 return; 43 } 44 45 switch (type) { 46 case "1": 47 //開始日時の追加 48 if (messageText.match(dateExp2)) { 49 var [matched, start_month, start_day] = messageText.match(dateExp2); 50 cache.put("type", 2); 51 cache.put("start_month", start_month); 52 cache.put("start_day", start_day); 53 54 //終了日時の質問 55 var year = new Date().getFullYear(); 56 var startDate = new Date(year, cache.get("start_month") - 1, cache.get("start_day")); 57 //pushDatePicker("開始日は\n"+ EventFormat(startDate) + "\nですね。\n\n次に予定の終了日時をお知らせください。", userId); 58 pushDatePicker("次に終了日を入力してください。", replyToken); 59 60 break; 61 } else { 62 reply(replyToken, "予定追加処理中です。\n「キャンセル」\nで追加作業をキャンセルします。"); 63 break; 64 } 65 case "2": 66 // 終了日時の追加 67 if (messageText.match(dateExp2)) { 68 var [matched, end_month, end_day] = messageText.match(dateExp2); 69 cache.put("type", 3); 70 cache.put("end_month", end_month); 71 cache.put("end_day", end_day); 72 //予定名の質問 73 var year = new Date().getFullYear(); 74 var endDate = new Date(year,cache.get("end_month")-1, cache.get("end_day")); 75 76 reply(replyToken, "終了日時は\n"+EventFormat(endDate)+"\n ですね。\n\n最後に予定名を教えてください。"); 77 break; 78 }else{ 79 reply(replyToken,"予定追加処理中です。\n「キャンセル」\nで追加作業をキャンセルします。"); 80 break; 81 } 82 case "3": 83 //最終確認 84 cache.put("type", 4); 85 cache.put("title", messageText); 86 var [title, startDate, endDate] = createData(cache); 87 //予定追加の確認 88 replyPlans(replyToken, "予定名:"+title,"開始日時:\n"+EventFormat(startDate)+"\n終了日時:\n"+ 89 EventFormat(new Date(endDate.setDate(endDate.getDate() - 1))), 90 "予定を追加しますか?\n「はい」か「いいえ」でお知らせください。"); 91 break; 92 case "4": 93 if (messageText === "はい") { 94 cache.remove("type"); 95 var [title, startDate, endDate]=createData(cache); 96 CalendarApp.getDefaultCalendar().createAllDayEvent(title, startDate, endDate); 97 reply(replyToken,"お疲れ様です\nGoogleカレンダーに予定を追加しました"); 98 } else if (messageText === "いいえ") { 99 cache.remove("type"); 100 reply(replyToken, "予定の追加をキャンセルしました。"); 101 } else { 102 reply(replyToken, "「はい」か「いいえ」でお答えください。"); 103 break; 104 } 105 break; 106 } 107 } 108} 109 110 111function pushDatePicker(message, replyToken) { 112 var url = "https://api.line.me/v2/bot/message/reply"; 113 UrlFetchApp.fetch(url, { 114 "headers": { 115 "Content-Type": "application/json; charset=UTF-8", 116 "Authorization": "Bearer "+ CHANNEL_ACCESS_TOKEN, 117 }, 118 "method": "post", 119 "payload": JSON.stringify({ 120 "replyToken": replyToken, 121 "messages": [ 122 { 123 "type": "template", 124 "altText": "datetime_picker", 125 "template": { 126 "type": "buttons", 127 "thumbnailImageUrl": "https://placehold.jp/640x480.jpg?text=datetime_picker", // 画像のURL 128 "imageAspectRatio": "rectangle", // 画像のアスペクト比、「rectangle: 1.51:1」・「square: 1:1」、デフォルト値はrectangle 129 "imageSize": "cover", // 画像の表示形式 130 "imageBackgroundColor": "#FFFFFF", // 画像の背景色 131 "title": "メニュー", 132 "text": message, 133 "defaultAction": { 134 "type": "uri", 135 "label": "View detail", 136 "uri": "https://www.line.me/" 137 }, 138 "actions": [ 139 { 140 "type": "datetimepicker", 141 "label": "ここをタップ", 142 "data": "action=settime", 143 "mode": "datetime", 144 "initial": Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy-MM-dd'T'HH:mm"), 145 // "max": "2018-01-24t23:59", 146 // "min": "2017-12-25t00:00" 147 } 148 ] 149 } 150 } 151 ], 152 "notificationDisabled": false // trueだとユーザーに通知されない 153 }), 154 }); 155 156 return// ContentService.createTextOutput(JSON.stringify({ "content": "postok"})).setMimeType(ContentService.MimeType.JSON); 157 158} 159 160createData(cache)161--->略 (現状から変えなくてよいはず) 162

投稿2021/08/24 06:35

編集2021/08/24 07:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SA-KYO

2021/08/24 07:15

毎回本当にご丁寧に回答・お教えくださり本当にありがとうございます。 感謝してもしきれないぐらい感謝の念に堪えません。 的確で、要所での解説もあり本当にわかりやすいです。 記述コードを丸写でコピーで終わるのではなく、 どのような意味があるのかまで解説いただいているので 本当にわかりやすいです。 そこで追記質問で申し訳ないのですが 一応全て書き換えてみたのですが どうも『予定の追加』がうまく動作しなくなりました???? どこか変になってしまっているのでしょうか? 重ね重ねで申し訳ありませんが 後少しお力をいただけると助かります、、 お忙しいところ大変恐縮ではございますが どうかよろしくお願い致します????‍♂️ ↓完成した記述コード↓ var CHANNEL_ACCESS_TOKEN = "アクセストークン"; // var dateExp = /(\d+)[/月](\d+)/; var dateExp2 = /(\d+)-(\d+)T\d+:\d+/; //doPost関数(Lineからメッセージを受け取る) function doPost(e) { GetMessage(e); } //受け取ったメッセージの処理 function GetMessage (e) { var event = JSON.parse(e.postData.contents).events[0] var replyToken = event.replyToken; var userId = event.source.userId; var eventtype = event.type; if (typeof replyToken === 'undefined') { return; } var messageText = ""; if (eventtype == "postback") { messageText = event.postback.params.datetime; } else { messageText = event.message.text; } var cache = CacheService.getScriptCache(); var type = cache.get("type"); if (type === null) { //予定の追加 if (messageText === "予定の追加") { cache.put("type", 1); //開始日時の質問 pushDatePicker("開始日を入力してください", userId); //今日、7日間の予定の取得 } else if (messageText.match("今日の予定")) { reply(replyToken, getEvents()); } else if (messageText.match("今週の予定")) { reply(replyToken, notifyWeekly()); } else { //処理方法 の返答 replyPlans(replyToken, "「予定の追加」で予定追加します。", "「今日の予定」で今日の予定をお知らせします。", "「今週の予定」で7日間の予定をお知らせします。"); } } else { //キャンセル処理 if (messageText === "キャンセル") { cache.remove("type"); reply(replyToken, "予定追加のキャンセルをしました"); return; } switch (type) { case "1": //開始日時の追加 if (messageText.match(dateExp2)) { var [matched, start_month, start_day] = messageText.match(dateExp2); cache.put("type", 2); cache.put("start_month", start_month); cache.put("start_day", start_day); //終了日時の質問 var year = new Date().getFullYear(); var startDate = new Date(year, cache.get("start_month") - 1, cache.get("start_day")); pushDatePicker("開始日は\n"+ EventFormat(startDate) + "\nですね。\n\n次に予定の終了日時をお知らせください。", userId); break; } else { reply(replyToken, "予定追加処理中です。\n「キャンセル」\nで追加作業をキャンセルします。"); break; } case "2": // 終了日時の追加 if (messageText.match(dateExp2)) { var [matched, end_month, end_day] = messageText.match(dateExp2); cache.put("type", 3); cache.put("end_month", end_month); cache.put("end_day", end_day); //予定名の質問 var year = new Date().getFullYear(); var endDate = new Date(year,cache.get("end_month")-1, cache.get("end_day")); reply(replyToken, "終了日時は\n"+EventFormat(endDate)+"\n ですね。\n\n最後に予定名を教えてください。"); break; }else{ reply(replyToken,"予定追加処理中です。\n「キャンセル」\nで追加作業をキャンセルします。"); break; } case "3": //最終確認 cache.put("type", 4); cache.put("title", messageText); var [title, startDate, endDate] = createData(cache); //予定追加の確認 replyPlans(replyToken, "予定名:"+title,"開始日時:\n"+EventFormat(startDate)+"\n終了日時:\n"+ EventFormat(new Date(endDate.setDate(endDate.getDate() - 1))), "予定を追加しますか?\n「はい」か「いいえ」でお知らせください。"); break; case "4": if (messageText === "はい") { cache.remove("type"); var [title, startDate, endDate]=createData(cache); CalendarApp.getDefaultCalendar().createAllDayEvent(title, startDate, endDate); reply(replyToken,"お疲れ様です\nカレンダーに予定を追加しました"); } else if (messageText === "いいえ") { cache.remove("type"); reply(replyToken, "予定の追加をキャンセルしました。"); } else { reply(replyToken, "「はい」か「いいえ」でお答えください。"); break; } break; } } } function pushDatePicker(message, userId) { UrlFetchApp.fetch(url, { "headers": { "Content-Type": "application/json; charset=UTF-8", "Authorization": "Bearer "+ CHANNEL_ACCESS_TOKEN, }, "method": "post", "payload": JSON.stringify({ "to": userId, "messages": [ { "type": "template", "altText": "datetime_picker", "template": { "type": "buttons", "thumbnailImageUrl": "https://placehold.jp/640x480.jpg?text=datetime_picker", // 画像のURL "imageAspectRatio": "rectangle", // 画像のアスペクト比、「rectangle: 1.51:1」・「square: 1:1」、デフォルト値はrectangle "imageSize": "cover", // 画像の表示形式 "imageBackgroundColor": "#FFFFFF", // 画像の背景色 "title": "メニュー", "text": message, "defaultAction": { "type": "uri", "label": "View detail", "uri": "https://www.line.me/" }, "actions": [ { "type": "datetimepicker", "label": "日時を選択してください。", "data": "action=settime", "mode": "datetime", "initial": Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy-MM-dd'T'HH:mm"), // "max": "2018-01-24t23:59", // "min": "2017-12-25t00:00" } ] } } ], "notificationDisabled": false // trueだとユーザーに通知されない }), }); return ContentService.createTextOutput(JSON.stringify({ "content": "postok"})).setMimeType(ContentService.MimeType.JSON); } // function createData(cache) { // 略 (現状から変更なし) // } function createData(cache) { var year = new Date().getFullYear(); //var year = 2020; var title = cache.get("title"); var startDate = new Date(year, cache.get("start_month") - 1, cache.get("start_day")); var endDate = new Date(year, cache.get("end_month") - 1, parseInt(cache.get("end_day")) + 1 ); var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day")); endDate = new Date(endDate.setDate(endDate.getDate() + 1)); return [title, startDate, endDate]; } function EventFormat(Date) { var y = Date.getFullYear(); var m = Date.getMonth() + 1; var d = Date.getDate(); var w = Date.getDay(); var weekname = ['日', '月', '火', '水', '木', '金', '土']; m = ('0' + m).slice(-2); d = ('0' + d).slice(-2); return y + '年' + m + '月' + d + '日 (' + weekname[w] + ')\n'; } function replyPlans(replyToken, message, message2, message3) { var url = "https://api.line.me/v2/bot/message/reply"; UrlFetchApp.fetch(url, { "headers": { "Content-Type": "application/json; charset=UTF-8", "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN, }, "method": "post", "payload": JSON.stringify({ "replyToken": replyToken, "messages": [{ "type": "text", "text": message, },{ "type": "text", "text": message2, },{ "type": "text", "text": message3, }], }), }); return ContentService.createTextOutput(JSON.stringify({"content": "post ok"})).setMimeType(ContentService.MimeType.JSON); } function reply(replyToken, message) { var url = "https://api.line.me/v2/bot/message/reply"; UrlFetchApp.fetch(url, { "headers": { "Content-Type": "application/json; charset=UTF-8", "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN, }, "method": "post", "payload": JSON.stringify({ "replyToken": replyToken, "messages": [{ "type": "text", "text": message, }], }), }); return ContentService.createTextOutput(JSON.stringify({"content": "post ok"})).setMimeType(ContentService.MimeType.JSON); } //今日の予定 function getEvents() { var events = CalendarApp.getDefaultCalendar().getEventsForDay(new Date()); var body = "今日の予定は\n"; if (events.length === 0) { body += "ありません。"; return body; } body += "\n"; events.forEach(function(event) { var title = event.getTitle(); body += "????" + title + "\n"; }); body += "\nです!"; return body; } //7日間の予定 function notifyWeekly() { var body = "1週間の予定は\n\n"; var weekday = ["日", "月", "火", "水", "木", "金", "土"]; for ( var i = 0; i < 7; i++ ) { var dt = new Date(); dt.setDate(dt.getDate()+i); var events = CalendarApp.getDefaultCalendar().getEventsForDay(dt); body += Utilities.formatDate(dt, "JST", '???? MM/dd(' + weekday[dt.getDay()] + ')') + "\n"; if (events.length === 0) { body += "ありません。\n"; } events.forEach(function(event) { var title = event.getTitle(); body += title + "\n"; }); } return body; } function HmFormat(date){ return Utilities.formatDate(date, "JST", "HH:mm"); }
退会済みユーザー

退会済みユーザー

2021/08/24 07:35

コードを修正しました。 pushDatePickerにurlを記載していなかったこちらのミスでした。 日時選択する場合もプッシュメッセージである必要はなく、通常のリプライでよさそうなので冒頭から書き換えてあります。
SA-KYO

2021/08/24 07:53

迅速にご回答、修正いただきありがとうございます。 しっかりと動作致しました。 嬉しくて笑顔が溢れてしまいます。 本当に何度もお助け、お力いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問