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

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

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

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google カレンダー

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

2128閲覧

【GAS】GASからGoogleカレンダーに終日イベントを登録したい

SA-KYO

総合スコア37

LINE Messaging API

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google カレンダー

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

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2021/08/20 09:52

前提・実現したいこと

GASからGoogleカレンダーに終日イベントを登録したい

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

複数日に渡り終日イベントを登録する場合は予定と開始日に加えて 終了日を付け加えることで対応可能だが、 終了予定日のみ一日加算しないとカレンダー上で想定通りの表示にならない とのことだが、加算したらにっすがおかしくなる。

該当のソースコード

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") + 1 ); 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(endDate), "予定を追加しますか?\n 「はい」か「いいえ」で\nお知らせください。"); break; case "4": if (messageText === "はい") { cache.remove("type"); var [title, startDate, endDate] = createData(cache); //↓↓↓↓↓↓↓↓↓↓↓↓↓該当コードかと↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ CalendarApp.getDefaultCalendar().createAllDayEvent(title, startDate, endDate); reply(replyToken, "お疲れ様です\nGoogleカレンダーに予定を追加しました"); } 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") + 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'; }

試したこと

var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day") + 1 );
+1 にしたらカレンダーに登録はされるが
終了日(endDate)が1年後のよく分からない日付になる

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

https://ytakeuchi.jp/?p=823

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記の部分が原因で期待通りの動作になっていないと思われます。
・終了日時の追加部分

var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day") + 1 );

・createData()での日付の加算の部分

var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day") + 1 );

【原因】
GASのCacheServiceは、値が見つかった場合は**String型の値を返します**。

Cacheから取り出した終了日は文字列型になっているので、これに「+ 1」としてしまうと、日付を表す文字列に"1"という文字列を連結して終了日を取得することになり、想定しない日付になってしまいます。

(例:終了日を「8/21」で入力すると、「年:2021、月:8、日:211」に対応するDateオブジェクトが返ってくる)

(なお、cache.get("end_month") - 1の部分のように、プラスではなくマイナスの場合、数字に自動的に変換されるため正しく計算されます。)

【対策】
cache.get("end_day") で得られる文字列を数字に直すか、日付として加算処理をする。

まず、 終了日時の追加部分では、終了日付に +1 する必要はありません。

diff

1 case "2": 2 // 終了日時の追加 3 if ( messageText.match(dateExp)) { 4 var [matched, end_month, end_day] = messageText.match(dateExp); 5 cache.put("type", 3); 6 cache.put("end_month", end_month); 7 cache.put("end_day", end_day); 8 //予定名の質問 9 var year = new Date().getFullYear(); 10 //var year = 2020; 11- var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day") + 1 ); 12+ var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day"));

 
次にcreateData関数を直します。

文字列を数字に直す場合:

diff

1function createData(cache) { 2 var year = new Date().getFullYear(); 3 var title = cache.get("title"); 4 var startDate = new Date(year, cache.get("start_month") - 1, cache.get("start_day")); 5- var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day") + 1 ); 6+ var endDate = new Date(year, cache.get("end_month") - 1, parseInt(cache.get("end_day")) + 1 ); 7 return [title, startDate, endDate]; 8} 9

または、日付の加算処理を行う方法を使った場合:

diff

1function createData(cache) { 2 var year = new Date().getFullYear(); 3 var title = cache.get("title"); 4 var startDate = new Date(year, cache.get("start_month") - 1, cache.get("start_day")); 5- var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day") + 1 ); 6+ var endDate = new Date(year, cache.get("end_month") - 1, cache.get("end_day")); 7+ endDate = new Date(endDate.setDate(endDate.getDate() + 1)); 8 return [title, startDate, endDate]; 9} 10

 

なお、このままだと最終確認時に終了日付が一日ずれて表示されるので、ここも直す必要があると思います。

diff

1 case "3": 2 // 最終確認 3 cache.put("type", 4); 4 cache.put("title", messageText); 5 var [title, startDate, endDate] = createData(cache); 6 //予定追加の確認 7- replyPlans(replyToken, "【予定名】:" + title, "予定日:\n" + EventFormat(startDate)+ "\n予定終了日:\n" + EventFormat(endDate), "予定を追加しますか?\n 「はい」か「いいえ」で\nお知らせください。"); 8+ replyPlans(replyToken, "【予定名】:" + title, "予定日:\n" + EventFormat(startDate)+ "\n予定終了日:\n" + EventFormat(new Date(endDate.setDate(endDate.getDate() - 1))), "予定を追加しますか?\n「はい」か「いいえ」でお知らせください。"); 9 break;

投稿2021/08/21 05:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SA-KYO

2021/08/21 06:00

ご丁寧にお答えいただきまして、 本当にありがとうございます!????‍♂️ 非常に分かりやすく、 しかも、例も上げてくださり 随所で解説もくださり、 自分が今まで見てきた参考書や、 動画、資料のどれよりも 分かりやすく感動しております???? また、 『GASのCacheServiceは、値が見つかった場合はString型の値を返します。』や 『(なお、cache.get("end_month") - 1の部分のように、プラスではなくマイナスの場合、数字に自動的に変換されるため正しく計算されます。)』 など、本当に自分がこれから先 ずっと使っていけるだろう 知識まで事細かに、ご教示くださり 自分が知りたい事、 調べてもでてこなかったことなど、 また、書き換えのコードの記述まで、 なにからなにまで、 本当に感謝しております!????‍♂️ 今から早速、実践してみます! すごくワクワクしています! 本当にありがとうございます????????‍♂️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問