Google Apps ScriptでFormのGridをスプレッドシートより再構築する【GAS】
前回の複数レコードを送信するフォームのエントリーにて、擬似的にGoogle Formで複数レコードを登録するコードを紹介しましたが、作っていて思い出したのが、「ドロップダウンリストやグリッドパーツの選択肢」の量がそこそこある場合、1回だけ作るならともかく、手直しが入る可能性がある(例えば支店名リスト。増えたり減ったり、統合したり)場合、位置や追加、削除が酷く面倒だったのを思い出しました。
これをスプレッドシート上の値を持って再構築してみようというのが今回の趣旨です。今回はちょいネタですが、その効用は非常に大きいです。他のパーツ類も同様に再構築が可能なので、変動の多い項目は、スプレッドシート連携にしてしまうと、メンテナンスが楽になります。
リンク
今回使用するファイル類
基本的には前回のサンプルファイルに追加している形です。
図:このグリッドパーツを再構築するのが今回の目的
ソースコード
今回は既存のグリッド項目(行)を再構築するだけなので、列に関しては足したり引いたりしていません。しかし、列の追加等も非常に簡単です。
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 |
//スプレッドシートのID var sheetid = "ここにスプレッドシートのIDを入れる"; function OverwriteGrid() { //スプレッドシートを取得 var sheet = SpreadsheetApp.openById(sheetid).getSheetByName("日付リスト"); //日付リストを取得する var data = sheet.getRange("A2:A").getValues(); var dlength = data.length; //1次元配列として作り直す var array = []; for(var i = 0;i<dlength;i++){ if(data[i][0] == ""){ //空白の時は何もしない }else{ array.push(data[i][0]); } } //アクティブフォームを取得する var form = FormApp.getActiveForm(); // 質問項目がプルダウンのもののみ取得 var items = form.getItems(FormApp.ItemType.GRID); items.forEach(function(item){ //対象のグリッドパーツを見つける if(item.getTitle().match(/出勤可否.*$/)){ //質問セクションを取得する var question = item.asGridItem(); //選択肢を上書きする question.setRows(array); } }); } |
ポイント
- スプレッドシート側は、単純に1列にリストを並べてるものを取ってきています(日付リストシートから取得します)。
- 入れ替えるためには、リストのデータを1次元配列にする必要があるため、配列を再構築しています。
- 配列データは空白の場合には、スルーし、ある場合にはpushしています。
- アクティブフォームに於いて「ItemTypeはGRID」のものをitemsとして取得しています。
- itemsの中でセクションタイトルが「出勤可否」に該当するものを取得し、asGridItemでそれを取得します。
- setRowsメソッドで行のデータを上書き再セットできます。
- setColumsメソッドで、列のデータを上書き再セットができます。こちらも1次元配列でOK.今回のケースで言えば["出勤","休暇","半休"]といったような形でセットすればOK.