新しいGoogle Formに時限設定を施す【GAS】
G Suiteのアドオンのほとんどは英語版のみで、日本語向けにリリースされているアドオンは殆ど見かけないのが残念なところ。アドオンの審査や申請が面倒であるのと、アドオンのような追加機能を作る、作り手も少ないという特性かもしれません。
今回は前回の活用するその②に引き続き、「なくても困らないけれど、あると助かる」そんな機能を装備してみたいと思います。その代表例として「指定時刻が来たらフォームの受付を自動停止する」機能があります。今回はこれをお手軽に装備できるようにしてみたいと思います。
今回使用するファイル類
事前準備
今回は、指定時刻に発火するトリガーを利用します。また、指定時刻を指定する為にダイアログを用意し、その上では日付と時刻をセットできるように、jQueryのDatePickerとTimePickerを装備します。事前準備として、以下の作業を行います。
- jQueryおよびjQuery UIのライブラリはGoogle CDNを利用する
- TimepickerアドオンをこのサイトよりClone or Downloadする
- 2.を解凍して、distにあるjquery-ui-timepicker-addon.jsおよびjquery-ui-timepicker-addon.cssをhttpsの使えるサーバにアップロードしておく(CloudFlareなどを利用しましょう)。
- さらにi18nの中にあるjquery-ui-timepicker-ja.jsも同様にアップロードしておく
この3つのファイルは今回の時刻をピックするパーツで利用するものになります。これらをHTML側コードのheadにて読み込みます。
ソースコード
GAS側コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
function onOpen() { var ui = FormApp.getUi(); ui.createMenu('▶セッティング') .addItem('セットアップ', 'getMyFormId') .addItem('時限設定', 'limitdialog') .addItem('制限解除', 'limitbreak') .addToUi(); } //自分自身のIDを取得するコード function getMyFormId(){ var form = FormApp.getActiveForm(); var ui = FormApp.getUi(); var myid = form.getId(); var Properties = PropertiesService.getScriptProperties(); Properties.setProperty("myformid", myid); ui.alert("セットアップ完了") return myid; } //フォームを閉じる関数 function closeform(){ //フォームのIDを取得する var Properties = PropertiesService.getScriptProperties(); var myformid = Properties.getProperty("myformid"); //フォームをクローズする var myForm = FormApp.openById(myformid); myForm.setAcceptingResponses(false); } //トリガーに時限設定を追加する function limitdialog(){ //formを取得する var form = FormApp.getActiveForm(); var ui = FormApp.getUi(); //HTMLダイアログを表示する var html = HtmlService.createHtmlOutputFromFile('index').setTitle('フォームを閉じる日付').setWidth(500).setHeight(600); ui.showModalDialog(html, "時限設定をする"); } //制限解除するコード function limitbreak(){ //トリガーを全削除 var allTriggers = ScriptApp.getProjectTriggers(); for(var i=0; i < allTriggers.length; i++) { ScriptApp.deleteTrigger(allTriggers[i]); } //フォームのIDを取得する var Properties = PropertiesService.getScriptProperties(); var myformid = Properties.getProperty("myformid"); var ui = FormApp.getUi(); //フォームをオープンする var myForm = FormApp.openById(myformid); myForm.setAcceptingResponses(true); //メッセージ表示 ui.alert("制限を解除しました"); } //日時トリガーを設定する function setTrigger(dateman,timeman){ //トリガーを全削除 var allTriggers = ScriptApp.getProjectTriggers(); for(var i=0; i < allTriggers.length; i++) { ScriptApp.deleteTrigger(allTriggers[i]); } //特定日時を作成する(時間はhh:mmで引数を受け取る) var trigger1 = new Date(Utilities.formatDate(new Date(dateman) , 'JST' , getDate(dateman,timeman))); //指定の日付と時刻でトリガーをセットする var onChangeTrigger = ScriptApp.newTrigger("closeform") .timeBased() .at(trigger1) .create(); //メッセージを表示 var ui = FormApp.getUi(); ui.alert("クローズする日付を設定しました。"); } //日付を整形して返す関数 function getDate(dateman,clockman){ var date = new Date(dateman); var year = date.getFullYear(); var month = date.getMonth() + 1; var date = date.getDate(); if (month < 10) { month = "0" + month; } if (date < 10) { date = "0" + date; } var strDate = year + "/" + month + "/" +date + " " + clockman; return strDate; } |
- フォームを開くと、パズルアイコンが出てくるので、セットアップを実行し、formのidをスクリプトプロパティに格納しておく。
- 時限設定を実行すると、設定用のダイアログが開かれます。そこで設定した内容は、setTriggerにて指定時刻で発火するように、トリガーがセットされます。その際に既存のトリガーを全削除するようにしてます。
- また、既存の時限設定を解除する為のlimitbrake関数を用意してあります。トリガーの解除とフォームクローズの解除を行っています。
- closeform関数にて、フォームの受付をクローズする処理が入っています。setAcceptingResponsesがFalseで閉じます。
- FormAppでは、showでダイアログを表示できないので、ui.showModalDialogにてHTMLダイアログを生成します。
図:これを自動で行なうのが今回の目的
図:トリガーはこんな感じでセットされます。
HTML側コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<!doctype html> <html> <head> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css"> <link rel="stylesheet" href="https://officeforest.org/wp/library/timepicker/jquery-ui-timepicker-addon.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/i18n/jquery.ui.datepicker-ja.js"></script> <script src="https://officeforest.org/wp/library/timepicker/jquery-ui-timepicker-addon.js"></script> <script src="https://officeforest.org/wp/library/timepicker/jquery-ui-timepicker-ja.js"></script> <script> //ピッカーを設定する $( function(){ $('#datetimepicker').datetimepicker({ //timeFormat: "HH:mm z", hourGrid: 4, minuteGrid: 10, }); }); //ボタンにイベントを割り当て $(function() { $( "input[type=submit], a, button" ) .button() .click(function() { settime(); }); }); function settime(){ //日時データを取得する var element = document.getElementById("datetimepicker").value; var dateman = new Date(element); //日付だけを取り出す var month = dateman.getMonth() + Number(1); var date = dateman.getFullYear() + "/" + month + "/" + dateman.getDate(); //時刻だけ取り出す var time = dateman.getHours() + ":" + dateman.getMinutes(); //GAS側へ処理を渡す google.script.run.setTrigger(date,time); } </script> </head> <body> <p>日付時刻の選択: <input type="text" name="date" id="datetimepicker"></p> <button style="font-size: 14px;vertical-align: middle" title='時限設定をする'>時限セット</button> </body> </html> |
- $('#datetimepicker').datetimepickerにて、日付と時刻設定ピッカーをセットしています。
- 取得した日付は一旦整形してから、GAS側のsetTrigger関数に渡しています。
- getMonthは0〜11の値を返すようになってるため、必ず+1を加算しないといけません。
- Google CDNには、jquery.ui.datepicker-ja.jsがあるので、これでDatePickerを日本語化しています。
図:日付と時刻をセットするダイアログを表示してます。
カスタムな受付終了メッセージ
デフォルトのままだと、現在受け付け終了していますメッセージは非常に簡素です。これを少しカスタマイズすることが可能です。その際に使うメソッドが「getCustomClosedFormMessage()」。引数にテキストを入れることによって、カスタムなクローズメッセージが表示可能です。
フォームの回答自体はもともと手動で「回答タブ」⇒「回答を受付中」のスイッチをオフにすることで閉め切れます。そこで回答締め切りメッセージ入力欄が出てくるので、入れておけばよいのですが、動的にこれを行う為のメソッドが今回のメソッド。
テキストしか利用出来ないので、HTMLなどは利用不可です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//マニュアルでフォームをクローズする function manualclose(){ //フォームのIDを取得する var Properties = PropertiesService.getScriptProperties(); var myformid = Properties.getProperty("myformid"); //フォームをクローズする var myForm = FormApp.openById(myformid); myForm.setAcceptingResponses(false); //クローズメッセージを表示; try{ myForm.getCustomClosedFormMessage("終了しちゃったよ"); FormApp.getUi().alert("フォームを閉じました"); }catch(e){ //すでにクローズ済みなので何もしない FormApp.getUi().alert("フォームはすでに閉じられています"); } } |
フォームがすでに閉じられているとこのメソッドはエラーを出してしまうので、エラートラップして、エラー時には何もしないようにメソッドを組んで上げる必要があります。