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()が正しく返ってくることが確認できた。