【GAS】Googleフォームの回答をスプレッドシートに書き込む方法
Googleフォームでは、スプレッドシートを回答先に選択することで、回答を自動でシートに書き込める。しかし、場合によっては、この機能を利用せずにシートへ書き込みたいことがある。今回はその方法として、GASでフォームの回答をシートに書き込む方法をまとめた。
手順
フォームを作成する
Googleフォームで適当なフォームを作成する( ここでは下記のようなフォームとする )。
スクリプトを作成する
フォームの編集画面からスクリプトエディタを開き、下記の関数やオブジェクトを定義する。
フォームを送信した時の処理をする関数
function OnSubmitForm( event_info )
{
const WRITER = new AnswerInfoWriter();
const ITEM_AND_ANSWER_PAIRS = event_info.response.getItemResponses();
const SPREADSHEET_URL = 'https://***';
const SPREADSHEET = SpreadsheetApp.openByUrl( SPREADSHEET_URL );
const SHEET = SPREADSHEET.getSheets()[ 0 ];
WRITER.Write( SHEET, ITEM_AND_ANSWER_PAIRS );
}
※ 5行目の定数SPREADSHEET_URL
には、回答を書き込みたいスプレッドシートのURLを代入する( このコードでは、そのスプレッドシートにある最初のシートへ書き込む )。
回答をシートへ書き込むオブジェクト
AnswerInfoWriter = function()
{
function _Write( sheet, item_and_answer_pairs )
{
const LOCK = LockService.getScriptLock();
if ( !LOCK.tryLock( 60 * 1000 ) )
{
Logger.log( '【 エラー 】 1分待機してもロックできなかったため、シートへ書き込まずに終了しました。' );
return;
}
_WriteHeader( sheet, item_and_answer_pairs );
_WriteData ( sheet, item_and_answer_pairs );
SpreadsheetApp.flush();
LOCK.releaseLock();
}
function _WriteHeader( sheet, item_and_answer_pairs )
{
const TITLES = item_and_answer_pairs.map( pair => pair.getItem().getTitle() );
TITLES.forEach( ( title, index ) =>
{
const CELL = sheet.getRange( 1, index + 1 );
CELL.setValue( title );
} );
}
function _WriteData( sheet, item_and_answer_pairs )
{
const ROW_NUMBER = sheet.getLastRow() + 1;
const ANSWERS = item_and_answer_pairs.map( pair => pair.getResponse() );
ANSWERS.forEach( ( answer, index ) =>
{
const CELL = sheet.getRange( ROW_NUMBER, index + 1 );
CELL.setValue( answer );
} );
}
return {
Write: _Write,
};
}
トリガーを設定する
スクリプトエディタでトリガーを追加し、先ほど定義したOnSubmitForm
関数をフォーム送信時に呼び出すようにする。
これでフォームを送信すると、シートに下記のような形で書き込まれる。