Google App ScriptでGoogle Formにリンクしたスプレッドシートを作る
Google App ScriptでGoogle Formとリンクしたスプレッドシートを作成するのは簡単にできる。
function main(){
var ss = SpreadsheetApp.getActive();//スプレッドシートを取得
var form = FormApp.create("テストフォーム");//フォームを作成
form.setDestination(FormApp.DestinationType.SPREADSHEET,ss.getId());//フォームの保存先をスプレッドシートに指定
}
しかし、シートの名前がフォームの回答1となっており、センスがない。これを変えるために、現在スプレッドシートに存在しているシートをすべて取得し、その中で、フォームと関連づけられているシートを返す関数を作成する。
function getFormSheet(){//google formとリンクしたシートを返す
var ss = SpreadsheetApp.getActive();
for (sheet of ss.getSheets()){
if (sheet.getFormUrl()){
return sheet;
}
}
return null;
}
sheet.getFormUrl()で、シートに関連付けられたフォームのURLを取得している。関連づけられていない場合はnullが返ってくる。これを利用して、グーグルフォームとリンクしたシートを取得できる。
よって、以下のようなプログラムを作成して、シート名の変更を試みる。
function main(){
var ss = SpreadsheetApp.getActive();//スプレッドシートを取得
var form = FormApp.create("テストフォーム");//フォームを作成
form.setDestination(FormApp.DestinationType.SPREADSHEET,ss.getId());//フォームの保存先をスプレッドシートに指定
var form_sheet = getFormSheet();
form_sheet.setName("フォーム用シート");
}
これで、いけるかと思いきや正しく取得できない!!。
1回目の実行ではform_sheetがnullが返ってくることで、form_sheet.setName("フォーム用シート")でエラーが発生する。
なんで??
っていろいろ調べると、getFormSheet関数内で取得しているスプレッドシート一覧にフォームの回答1という名前が含まれていないということが判明した。
はっ??
と思って、getFormSheet()のみをもう一度実行してみると、なんと、フォームと対応したシートが正しく返ってくる。
ワケガワカラナイ...
と思いながらも、フォームのような外部クラスのプログラムからスプレッドシートを操作すると更新が遅れるタイプかな?と思ったので、Utility.sleep(30000)とか遅らせてみたがダメ。
そこで、更新系のメソッドないかなぁ~とドキュメントを眺めてると、なんとそれらしいSpreadsheetApp.flush()を発見!!
function getFormSheet(){//google formとリンクしたシートを返す
var ss = SpreadsheetApp.getActive();
SpreadsheetApp.flush();
for (sheet of ss.getSheets()){
Logger.log(sheet.getName());
if (sheet.getFormUrl()){
return sheet;
}
}
return null;
}
getFormSheet()にSpreadsheetApp.flush()を追加することで、1回目の実行でもgetFormSheet()が正しく返ってくることが確認できた。