様々なビジネスシーンで、Google Formを使う場面があるかと思います。例えば、予約に使ったり、アンケートに使ったり…などなどです。なかでも、予約に使う時、予約できる日付を「今日から1週間後までにする」といった動的な設定をしたい、しかし現状では毎日手動でリストを直さなければならない、、、そんな時があるかと思います。
こういう時こそGASの出番です。トリガの機能をうまく使って、From(フォーム)の内容を毎日自動更新していきましょう!
今回は、Google Formの日付選択をプルダウンで設定した上で、その日付をGASを用いて自動的に毎日更新する、そんな事を実現できるやり方・方法を紹介します。
予約専用のGoogle Formを作成する
まず、日付を自動更新してくれる予約フォームを作成します。Googleドライブの任意の場所で、左上の「+新規」ボタンから、Googleフォームを選択>空白のフォームで作成してください。名前は適当に「日付自動更新予約フォーム」とでもしておきましょうか。
予約日自動更新システムを実装する
それでは、このフォームに予約日を「当日〜一週間後」の日付のリストになるように、自動更新できるスクリプトを実装していきます
予約日をプルダウン式にする
まず、「予約日を選択してください」という項目を作り、そこを「プルダウン」にしてください。
そして、本日から1週間の日付を1つずつ入力していきます。
そしてこれを日が変わるタイミングで毎日手動で、再度「本日〜1週間後」という範囲でリストを入れ替えていきます…とはしません。この手動の部分をGASで自動化していきます。
コンテナバインド型でスクリプトファイルを作成
では、右上の「…」のボタンから、コンテナバインド型でスクリプトファイルを作成してください。
スクリプトファイルのプロジェクト名を変更したら、以下の様にコードを記述してください。
function autoBookedDateUpdate() {
let form = FormApp.getActiveForm();
let items = form.getItems();
let item = items[0]
// Dateオブジェクトを作成
let date = new Date();
// Dateオブジェクトを利用した各年月曜日の情報を抽出
let year = date.getFullYear();
let month = date.getMonth() + 1; // 月は+1して1〜12の範囲に
let day = date.getDate();
// 曜日を判定
let dayOfWeek = date.getDay();
let dayOfWeekStr = ["日", "月", "火", "水", "木", "金", "土"][dayOfWeek];
let lists = [];
for (let i = 0; i < 7; i++) {
let lists_date = `${year}年${month}月${day}日(${dayOfWeekStr})`; // 変数名の誤りを修正
lists.push(lists_date);
// 日付を1日進める
date = new Date(date.setDate(date.getDate() + 1));
day = date.getDate();
dayOfWeek = date.getDay();
dayOfWeekStr = ["日", "月", "火", "水", "木", "金", "土"][dayOfWeek];
}
// listsにデータが入っているか確認用
// console.log(lists);
// item(最初の設問)にプルダウンリストを作成し挿入する
item.asListItem().setChoiceValues(lists);
}
保存したら、実行してみましょう。初回実行時はGASがフォームを操作して良いかの承認作業が入りますので、指示に従って権限承認してください。
実行が無事完了したら、元のフォームに戻ってみてください。曜日付きできちんとプルダウンリストに、「今日〜来週まで」の予定がきちんと入っていることが確認できます!
コードの具体的な説明
では、このコードが何をしているのかもう少し具体的に解説していきます。
設問データの取得
まず、最初はフォームと連携するコードが挿入されており、次にフォームのすべての設問データを取得するform.getItems()
を実行しています。この情報が入ったitems
の最初の要素をさらにitem
に格納しています。この場合だと、最初の設問である「予約日を選択してください」の参照データがitem
に入っている状態です。
let form = FormApp.getActiveForm();
// フォームのすべての設問データを取得
let items = form.getItems();
// フォームで最初のデータをitem変数に格納
let item = items[0]
日付データの取得と整形
次に、Dateオブジェクトを利用した今日の日付取得をしています。new Date()
で実行時の日付や時間のデータを取得することができます。それがdateという変数に入っています。
そのdate
を使って、getFullyear()
やgetMonth()
など、年月日を取得するメソッドを使ってそれぞれの情報を取得しています。ちなみにgetMonth()
に関しては、0から始まるデータになるため、「+1」をして補正をしています。
// Dateオブジェクトを作成
let date = new Date();
// Dateオブジェクトを利用した各年月曜日の情報を抽出
let year = date.getFullYear();
let month = date.getMonth() + 1; // 月は+1して1〜12の範囲に
let day = date.getDate();
// 曜日を判定
let dayOfWeek = date.getDay();
let dayOfWeekStr = ["日", "月", "火", "水", "木", "金", "土"][dayOfWeek];
曜日の判定はdate.getDay()
を利用しています。これはDate オブジェクトのメソッドで、その日付が週の何日目かを示す整数を返すような仕組みになっています。このメソッドによって返される整数は、0(日曜日)から6(土曜日)までの値です。これにより、整数を曜日のリストにマッピングすることで、週のどの日かを数値で取得できるというわけです。
プルダウンに入れる要素を作成する
let lists = [];
for (let i = 0; i < 7; i++) {
let lists_date = `${year}年${month}月${day}日(${dayOfWeekStr})`; // 変数名の誤りを修正
lists.push(lists_date);
// 日付を1日進める
date = new Date(date.setDate(date.getDate() + 1));
day = date.getDate();
dayOfWeek = date.getDay();
dayOfWeekStr = ["日", "月", "火", "水", "木", "金", "土"][dayOfWeek];
}
// listsにデータが入っているか確認用
// console.log(lists);
最後にこちらのコードですが、これは最終的にプルダウンに入力する文字列を格納するlists[]
を用意し、そこに先ほどの年月日の情報を用いて一つずつ格納していくという流れになっています。
一週間分のデータを格納したいので、for文で7回処理をループさせ、処理が回るたびにdateの値を1日進めたものにします。1日進めるには、setDate(date.getDate() + 1)
で実現することが可能です。
フォームのプルダウンリストにデータを挿入する
そして、最後の行で、フォームのプルダウンリストに格納したデータを挿入しています。
// item(最初の設問)にプルダウンリストを作成し挿入する
item.asListItem().setChoiceValues(lists);
これが、コード全体の流れになります。
毎日プルダウンリストの内容が更新されるように、トリガを設定する
さて、これを毎日日付更新するには、GASの機能に搭載されている「トリガ」を利用します。
今回は、作成したautoBookedDateUpdate()
関数に対し、毎日0~1時に実行される様、以下の様にトリガを設定します。
この設定で、「保存」をクリックして内容を保存してください。すると、1日おきにフォームのプルダウンリストが自動的に最新の日付になっているはずです!
まとめ
今回は、予約フォームを作成する際に日付を制限して、プルダウンリストのデータを自動更新する方法について解説していきました。この方法は非常に汎用性が高く、コストを押さえて予約システムを作ることができるため、是非実装を検討してみてください。
日付の設定部分が少し難しいかもしれませんが、一度理解してしまえば、様々な場面で活用することができます。
是非皆さんもやってみてください。
コメント