【GAS】Googleフォームの回答をスプレッドシートに書き込む方法

2021年12月23日

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関数をフォーム送信時に呼び出すようにする。

フォーム送信時のトリガー

これでフォームを送信すると、シートに下記のような形で書き込まれる。

フォームの回答をシートに書き込み