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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

962閲覧

Googleフォームでのラジオボタンでの選択肢(日付)を自動更新したい。

KOJI

総合スコア3

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2023/06/22 03:27

実現したいこと

Googleフォームでのラジオボタンでの選択肢(日付)を自動更新したい。

前提

GoogleフォームのGASである質問(ラジオボタン)の選択肢が日付で
(例)「6月27日(火)~7月4日(月)」
のように
現在の3週間前から未来の5週間後までの
火曜日から月曜日までの日にちを毎朝の自動更新したいのですが…

トリガーで毎朝7~8時更新にしているのですが、
更新されると…
(例)「6/26日(水)~7/3(月)」
のように
・日にちが1日前にズレる
・曜日表示が火~月ではなくなる

等のエラーが必ず起きます。

毎朝7~8時更新トリガーで
正しく日付と曜日を自動更新したいです。

お力をお貸しください。
宜しくお願いします。

発生している問題

・(例)「6/26日(水)~7/3(月)」のように日にちが1日前にズレる
・(例)「6/26日(水)~7/3(月)」のように曜日表記が変になる

該当のソースコード

GAS

1function updateFormRadio() { 2 var formUrl = "フォームのURL"; 3 var targetQuestionTitle = "シフトの期間を選んでください"; // 対象の質問のタイトルを指定 4 5 var form = FormApp.openByUrl(formUrl); 6 var items = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE); 7 8 for (var i = 0; i < items.length; i++) { 9 var item = items[i]; 10 var itemTitle = item.getTitle(); 11 12 if (itemTitle === targetQuestionTitle) { 13 var currentDate = new Date(); 14 var currentDay = currentDate.getDay(); // 現在の曜日を取得 15 16 var startWeek = new Date(currentDate); 17 startWeek.setDate(startWeek.getDate() - (7 * 3)); // 3週間前の日付 18 startWeek = getTuesdayOfWeek(startWeek); // 火曜日の日付に調整 19 20 var endWeek = new Date(currentDate); 21 endWeek.setDate(endWeek.getDate() + (7 * 5)); // 5週間後の日付 22 endWeek = getMondayOfWeek(endWeek); // 月曜日の日付に調整 23 24 var tuesdays = []; 25 var currentWeek = new Date(startWeek); 26 27 while (currentWeek <= endWeek) { 28 tuesdays.push(new Date(currentWeek)); 29 currentWeek.setDate(currentWeek.getDate() + 7); // 週を1週ずつずらす 30 } 31 32 if (tuesdays.length === 0) { 33 throw new Error("期間が見つかりませんでした。"); 34 } 35 36 var dateStrings = tuesdays.map(function(tuesday) { 37 var startDate = new Date(tuesday); 38 var endDate = new Date(tuesday); 39 endDate.setDate(endDate.getDate() + 6); // 開始日から6日後を終了日とする 40 var startDateString = Utilities.formatDate(startDate, "GMT", "yyyy/MM/dd"); 41 var endDateString = Utilities.formatDate(endDate, "GMT", "MM/dd"); 42 var dayOfWeekString = getDayOfWeekString(currentDay); // 曜日の表記を取得 43 return startDateString + "(" + dayOfWeekString + ")~" + endDateString + "(月)"; 44 }); 45 46 if (item.getType() === FormApp.ItemType.MULTIPLE_CHOICE) { 47 var question = item.asMultipleChoiceItem(); 48 question.setChoiceValues(dateStrings); 49 } else { 50 throw new Error("対象の質問が複数選択式ではありません。"); 51 } 52 break; 53 } 54 } 55} 56 57// 指定された日付の火曜日を取得する関数 58function getTuesdayOfWeek(date) { 59 var day = date.getDay(); 60 var diff = (day < 2) ? 2 - day : 9 - day; 61 date.setDate(date.getDate() + diff); 62 return date; 63} 64 65// 指定された日付の月曜日を取得する関数 66function getMondayOfWeek(date) { 67 var day = date.getDay(); 68 var diff = (day < 1) ? 1 - day : 8 - day; 69 date.setDate(date.getDate() + diff); 70 return date; 71} 72 73// 曜日の表記を取得する関数 74function getDayOfWeekString(day) { 75 var daysOfWeek = ["日", "月", "火", "水", "木", "金", "土"]; 76 return daysOfWeek[day]; 77} 78 79

試したこと

毎分更新にして試したが(昼過ぎ)、ズレることはなく
毎朝更新にすると必ずズレる

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

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

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

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

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

guest

回答1

0

ベストアンサー

この回答はGPT-4による自動生成回答です

問題は、Utilities.formatDate関数で使用しているタイムゾーンが "GMT" に設定されていることです。これにより、日付が1日ずれることがあります。タイムゾーンを修正することで、期待通りの結果が得られるはずです。

まず、スクリプトのタイムゾーンを確認してください。スクリプトエディタで ファイル > プロジェクトのプロパティ > 情報 を開き、タイムゾーンを確認してください。例えば、日本の場合は "Asia/Tokyo" になります。

次に、Utilities.formatDate 関数のタイムゾーンを修正します。以下のように変更してください。

javascript

1var startDateString = Utilities.formatDate(startDate, "Asia/Tokyo", "yyyy/MM/dd"); 2var endDateString = Utilities.formatDate(endDate, "Asia/Tokyo", "MM/dd");

タイムゾーンを "Asia/Tokyo" に変更した場合のコード例です。

javascript

1function updateFormRadio() { 2 // 省略 3 4 var dateStrings = tuesdays.map(function(tuesday) { 5 var startDate = new Date(tuesday); 6 var endDate = new Date(tuesday); 7 endDate.setDate(endDate.getDate() + 6); // 開始日から6日後を終了日とする 8 var startDateString = Utilities.formatDate(startDate, "Asia/Tokyo", "yyyy/MM/dd"); 9 var endDateString = Utilities.formatDate(endDate, "Asia/Tokyo", "MM/dd"); 10 var dayOfWeekString = getDayOfWeekString(currentDay); // 曜日の表記を取得 11 return startDateString + "(" + dayOfWeekString + ")~" + endDateString + "(月)"; 12 }); 13 14 // 省略 15}

これで、毎朝の更新でも日付と曜日が正しく表示されるはずです。

投稿2023/06/22 03:28

teratail-ai

Powered by GPT-4

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

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

KOJI

2023/06/22 03:33

GPTによる回答ですので、皆様の回答をお待ちしたいと思います。
macaron_xxx

2023/06/25 23:11

この回答は正しいと思いますよ。 曜日がずれる部分に関してですが、固定で(火)でいいのでは…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問