Translate

ラベル *Google Forms の投稿を表示しています。 すべての投稿を表示
ラベル *Google Forms の投稿を表示しています。 すべての投稿を表示
Post Date:2021年3月6日 

Googleフォームの選択肢をシートのデータで更新する

ゾウでもわかる Google Apps Script

GAS(Google Apps Script)で Googleフォームのプルダウン、チェックボックス、ラジオボタンの選択肢をスプレッドシートの値で更新する方法についての説明です。

同じフォームを長く使っていて、時々フォーム上の選択肢を更新するような場合には、シート上で選択肢の値が管理できるようになるので便利です。

このサンプルコードでできることは、

  • シート上の値で選択肢の内容を更新
  • プルダウン、チェックボックス、ラジオボタンに対応
  • 更新できるの質問は1個(質問番号を指定)

です。


フォームとシートの作成(準備)

プルダウン、チェックボックス、ラジオボタンの選択肢の更新をするので、下記の3つの質問を作成します。選択肢はスプレッドシートから更新するので設定不要です。

  1. 商品名(プルダウン)
  2. 商品名(チェックボックス)
  3. 商品名(ラジオボタン)
Googleフォームのサンプル

次に選択肢をシートで管理するために、シートのA列1行目にタイトルを入れて、2行目からデータを入れます。

Googleスプレッドシート上の選択肢

これで準備は完了です。

次からがGoogle Apps Scriptの例になります。


プルダウンの選択肢を更新する

質問番号を指定して質問の選択肢を更新するという簡単なサンプルです。このサンプルコードはプルダウンの質問項目の選択肢用なので、指定した質問番号がチェックボックス、ラジオボタンの場合にはエラーとなります。

上記フォーム例では、プルダウンは1番目の質問です。

下記サンプルコードをスクリプトエディタのコードに貼り付けてください。

function updateFormList() {
  //フォームの質問番号
  var questionNo = 1
  //フォームID
  var formId  = '1234567890abcdefghijklmnopqrstuvwxyz'
  //シートID
  var sheetId = 'zyxwvutsrqponmlkjihgfedcba0987654321'
  //シート名
  var sheetName = 'List'
  //データ配置列名
  var colName = 'A'
  //データ開始行
  var rowNum = 2
 
  //フォームの取得
  var form = FormApp.openById(formId)
  //全質問項目を取得
  var items = form.getItems()
  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
  var item = items[questionNo-1]

  //スプレッドシートを取得
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)
  //シートの最終行を取得
  var lastRow = sheet.getLastRow()

  //リスト内容の取得
  var arrList = sheet.getRange(colName + rowNum + ':' + colName + lastRow).getValues()

  //選択肢をフォームに反映
  item.asListItem().setChoiceValues(arrList)
}

フォームの質問番号

更新する質問番号を3行目の変数(questionNo)に代入します。上記のGoogleフォームの例ではプルダウンの質問は1番目なので1を指定します。

 2.  //更新するフォームの質問番号
 3.  var questionNo = 1

実際には配列として取得されるので1番目の質問項目は、配列の0番目となるので、16行目で questionNo-1 としています。

19.  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
20.  var item = items[questionNo-1]

フォームIDとシートID

GoogleフォームとGoogleスプレッドシートは、IDで取得しています。

フォームIDについては、象と散歩: GASでGoogleフォームの値を取得する(フォームを指定) でも説明していますが、再掲となります。

Googleフォームの編集URLが下記の場合、フォームIDは、赤字の部分です。

https://docs.google.com/forms/d/1234567890abcdefghijklmnopqrstuvwxyz/edit

シートIDも同様でに赤字の部分となります。

https://docs.google.com/spreadsheets/d/zyxwvutsrqponmlkjihgfedcba0987654321/edit

5行目にシートIDを7行目にシートIDを指定していますが、作成したフォームとスプレッドシートのURLを確認して書き換えてください。

 4.  //フォームID
 5.  var formId = ‘1234567890abcdefghijklmnopqrstuvwxyz'
 6.  //シートID
 7.  var sheetId = 'zyxwvutsrqponmlkjihgfedcba0987654321'

シート名

9行目にスプレッドシートのシート名を指定します。今回のサンプルではシート名をListとしています。

 8.  // シート名
 9.  var sheetName = 'List'

データ開始位置

10-13行目でシートのデータ開始を指定します。例ではA列2行目からが選択肢のデータとなりますので、11行目の colName にAを、13行目の rowNum に2を指定します。

10.  //データ配置列名
11.  var colName = 'A'
12.  //データ開始行
13.  var rowNum = 2

プルダウン選択肢の更新

28行目で、指定したデータ開始位置(A列2行目)からデータがある最終行までを arrList に格納しています。

シート上の 商品A, 商品B, 商品C が、

arrList[0]    商品A
arrList[1]    商品B
arrList[2]    商品C

として格納されます。

そして、31行目で、この配列の値でフォームの質問番号に該当する質問の選択肢(プルダウン)を更新しています。

30. //選択肢を更新する
31. item.asListItem().setChoiceValues(arrList)

asListItem() はプルダウン項目用なので questionNo で指定した質問がプルダウンでない場合にはエラーとなるので注意してください。item.getType() で質問のタイプを確認することができます。プルダウンの質問のタイプは LIST です。

updateFormList を実行します。

スクリプトエディタから実行

ログには実行完了とだけ表示されますが、フォームを参照すると、

Googleフォーム プルダウン形式

シート上のデータでプルダウンの選択肢が更新されています。


チェックボックスの選択肢を更新する

スプレッドシート上にある選択肢を配列に入れて、フォームの選択肢を更新する処理は基本的には同じです。プラダウンのサンプルを実行されたのであれば変更箇所は2箇所だけです。


フォームの質問番号

更新する質問番号を3行目の変数(questionNo)に代入しますが、上記のGoogleフォームの例ではチェックボッククスの質問は2番目なので2を指定します。

 2.  //更新するフォームの質問番号
 3.  var questionNo = 2

チェックボックス選択肢の更新

31行目をチェックボックス項目用の asCheckboxItem() に変更します。またチェックボックスは、選択肢に「その他」を設定できますが、showOtherOption() でその他の有無を指定します。

  • showOtherOption(true)    その他 あり
  • showOtherOption(false)   その他 なし

その他の選択肢を追加する場合の例となります。

30. //選択肢を更新する
31. item.asCheckboxItem( ).setChoiceValues(arrList).showOtherOption(true)

updateFormList を実行すると、商品A ,B,C と その他の選択肢が追加されます。

Googleフォーム チェックボックス形式

チェックボックスを更新するコード全体はこちらです。

function updateFormList() {
  //フォームの質問番号
  var questionNo = 2
  //フォームID
  var formId  = '1234567890abcdefghijklmnopqrstuvwxyz'
  //シートID
  var sheetId = 'zyxwvutsrqponmlkjihgfedcba0987654321'
  //シート名
  var sheetName = 'List'
  //データ配置列名
  var colName = 'A'
  //データ開始行
  var rowNum = 2
 
  //フォームの取得
  var form = FormApp.openById(formId)
  //全質問項目を取得
  var items = form.getItems()
  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
  var item = items[questionNo-1]

  //スプレッドシートを取得
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
  //シートの最終行を取得
  var lastRow = sheet.getLastRow()

  //リスト内容の取得
  var arrList = sheet.getRange(colName + rowNum + ':' + colName + lastRow).getValues()

  //選択肢をフォームに反映
  item.asCheckboxItem( ).setChoiceValues(arrList).showOtherOption(true)
}

ラジオボックスの選択肢を更新する

続いて、ラジオボックの場合となります。こちらも変更箇所は2箇所だけです。


フォームの質問番号

ラジオボックスの質問は3番目なので questionNo に を代入します。

 2.  //更新するフォームの質問番号
 3.  var questionNo = 3

ラジオボックス選択肢の更新

35行目をラジオボックス用の asMultipleChoiceItem() に変更します。今回は、「その他」の選択肢を付けない showOtherOption(false) とします。

30. //選択肢を更新する
31. item.asMultipleChoiceItem().setChoiceValues(arrList).showOtherOption(false)

updateFormList を実行すると、商品A ,B,C がラジオボックの選択肢として追加されます。

Googleフォーム ラジオボタン形式

ラジオボックスを更新するコード全体はこちらです。

function updateFormList() {
  //フォームの質問番号
  var questionNo = 3
  //フォームID
  var formId  = '1234567890abcdefghijklmnopqrstuvwxyz'
  //シートID
  var sheetId = 'zyxwvutsrqponmlkjihgfedcba0987654321'
  //シート名
  var sheetName = 'List'
  //データ配置列名
  var colName = 'A'
  //データ開始行
  var rowNum = 2
 
  //フォームの取得
  var form = FormApp.openById(formId)
  //全質問項目を取得
  var items = form.getItems()
  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
  var item = items[questionNo-1]

  //スプレッドシートを取得
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)
  //シートの最終行を取得
  var lastRow = sheet.getLastRow()

  //リスト内容の取得
  var arrList = sheet.getRange(colName + rowNum + ':' + colName + lastRow).getValues()

  //選択肢を更新する
  item.asMultipleChoiceItem().setChoiceValues(arrList).showOtherOption(false)
}

更新する質問のタイプを確認しよう(22.2.11追記)

何件かご質問もいただきましたが、上記のサンプルで実行エラーとなる場合の多くは、質問番号で指定した番号の質問タイプと利用するメソッドが違う場合です。

下記のエラーが出力される場合が、

エラー Exception: Invalid conversion for item type: XXXXX

更新しようとする質問のタイプとメソッドが一致していない場合に出力されるエラーで、type:XXXX には、指定した質問のタイプが表示されます。

Gooleフォームで設問に指定できる項目とタイプについて下表にまとめています。

質問項目タイプ更新に利用するメソッド
プルダウンLISTasListItem()
チェックボックスCHECKBOXasCheckboxItem()
ラジオボタンMULTIPLE_CHOICEasListItem()
記述式TEXT-
段落PARAGRAPH_TEXT-
ファイルのアップロードFILE_UPLOAD-
均等メモリSCALE-
選択式(グリッド)GRID-
チェックボックス(グリッド)CHECKBOX_GRID-
日付DATE-
時刻TIME-
セクションPAGE_BREAK-
タイトルSECTION_HEADER-
画像IMAGE-
動画VIDEO-

セクション、写真、動画なども質問となるので指定する番号に注意してください。


質問タイプを確認するコード

Loggerで指定した質問番号のタイプをログに出力するコードを追加してみてください。

19. //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
20. var item = items[questionNo-1]

下記のコードを21行目以降に追加します。

  Logger.log('質問総数:' + items.length)
  Logger.log('質問番号:' + questionNo)
  Logger.log('タイトル:' + item.getTitle())
  Logger.log('タイプ:' + item.getType())

下記のように、質問総数、指定した質問番号(questionNo)、質問のタイトル、タイプが出力されます。

情報 質問総数:3
情報 質問番号:1
情報 タイトル:商品名(プルダウン)
情報 タイプ:LIST

下記は、更新はせずに、指定した質問番号のタイプを確認するサンプルコードです。

function updateFormList() {
  //フォームの質問番号
  var questionNo = 1
  //フォームID
  var formId  = '1234567890abcdefghijklmnopqrstuvwxyz'
 
  //フォームの取得
  var form = FormApp.openById(formId)
  //全質問項目を取得
  var items = form.getItems()
  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
  var item = items[questionNo-1]

  Logger.log('質問総数:' + items.length)
  Logger.log('質問番号:' + questionNo)
  Logger.log('タイトル:' + item.getTitle())
  Logger.log('タイプ:' + item.getType())
}

スプレッドシートのメニューから実行する

下記のコードを追加すると、スプレッドシートを開いたときに、メニューに "Form選択肢更新" が追加されます。

スプレッドシートのメニューに追加

”商品名更新” を選択すると updateFormList() がスクリプト エディタを開かなくても実行できます。

function onOpen(){ 
  SpreadsheetApp
    .getActiveSpreadsheet()
    .addMenu('Form選択肢更新', [
      {name: '商品名更新', functionName: 'updateFormList'},
    ]);
}

GASの基礎を学べる参考図書

ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。

詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。

Udemy オススメ講座

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

講師:事務職たらこ

印象に残りやすい手書き風スライドを用いGASの基本的なプログラミングを気軽に学ぶことができる。本講座でGASを活用した自動化ができるレベルにはなれないが、基礎としては十分。

Post Date:2021年1月16日 

GASでGoogleフォームの値を取得する(フォームを指定)

ゾウでもわかる Google Apps Script

Googleフォームでの回答内容をGAS(Google Apps Script)で参照する方法です。

Googleフォームの値を取得するには2種類の方法があります。

  1. フォームが実行されたときに値を取得
  2. フォームを指定して回答内容を取得

今回は、「フォームを指定して回答内容を取得」する方法についての説明です。


フォームオブジェクトの取得

フォームオブジェクトを取得する方法には2つあります。


アクティブなフォームを開く

フォームからスクリプトエディタを開いてスクリプトを作成する場合には、アクティブなフォームが取得できます。

変数 = FormApp.getActiveForm()

フォームID/フォームURLを指定してフォームを開く

もうひとつが、フォームIDかフォームURLを指定する方法です。

変数 = FormApp.openBy(フォームID)
変数 = FormApp.openByUrl(フォームURL)

フォームの編集URLが下記の場合にフォームIDは、赤字の部分となります。

https://docs.google.com/forms/d/1234567890abcdefghijklmnopqrstuvwxyz/edit

実際のコードでは下記のように書きます。

function formObject() {
  //フォームID
  var formId = '1234567890abcdefghijklmnopqrstuvwxyz'

  //フォームオブジェクトの取得
  var form = FormApp.openById(formId)
}

フォームURLは、青字の部分で、最後のスラッシュは必要です。

https://docs.google.com/forms/d/1234567890abcdefghijklmnopqrstuvwxyz/edit

URLを指定した場合のサンプルコードです。

function formObject() {
  //フォームURL
  var formUrl    = 'https://docs.google.com/forms/d/1234567890abcdefghijklmnopqrstuvwxyz/'

  //フォームオブジェクトの取得
  var form  = FormApp.openByUrl(formUrl)
}

フォームの回答を取得する

フォームの回答を取得するには3段階の手順が必要です。

  1. フォームの全回答を取得
  2. ひとつの回答を選択
  3. 質問と回答内容を取得

フォームの全回答を取得

上で取得したフォームオブジェクトを指定して全回答を取得します。取得した回答は配列([1件目の回答, 2件目の回答, 3件目の回答, .....])となっているので回答数はlengthでわかります。

※ 実行する際には、var formId = 'フォームID' のフォームIDの部分を書き換えてください。

function formObject() {
  //フォームID
  var formId = '1234567890abcdefghijklmnopqrstuvwxyz'

  //フォームオブジェクトの取得
  var form = FormApp.openById(formId)
  
  //全回答の取得
  var formResponses = form.getResponses()
  
  //全回答数
  Logger.log('回答数 = ' + formResponses.length)
}

現在の回答数が3件であることがわかります。

回答数 = 3

ひとつの回答を選択

上のサンプルコードで全回答を取得した変数formResponsesは配列になっています。いま3件の回答があるので下記のようにして各々を取得できます。

  • formResponses[0] ・・・ 1件目の回答
  • formResponses[1] ・・・ 2件目の回答
  • formResponses[2] ・・・ 3件目の回答

そして、getItemResponses()で回答内容が取得できます。

変数 = formResponses[n番目].getItemResponses()

取得した回答内容にいくつの質問があるのかは、lengthで求められます。サンプルで使用しているフォームの質問は「日付」「時刻」「氏名」と3つです。

Google Sheets(フォーム回答内容)

結果が3となるかを確認します。

function formObject() {
  //フォームID
  var formId = '1234567890abcdefghijklmnopqrstuvwxyz'

  //フォームオブジェクトの取得
  var form = FormApp.openById(formId)
  
  //全回答の取得
  var formResponses = form.getResponses()
  
  //1件目の回答を取得
  var itemResponses = formResponses[0].formResponse.getItemResponses()

  //質問件数
  Logger.log('質問項目数 = ' + itemResponses.length)
}

質問項目数 = 3

質問と回答内容を取得

これでやっと回答内容を取得する準備が整いました。

フォームの質問を取得するには

変数 = n番目の項目.getItem().getTitle()

フォームの回答を取得するには

変数 = n番目の項目.getResponse()

で、取得できます。

下記のコードでで1件目の回答の1つ目の質問と回答内容が取得できます。

function formObject() {
  //フォームID
  var formId = '1234567890abcdefghijklmnopqrstuvwxyz'

  //フォームオブジェクトの取得
  var form = FormApp.openById(formId)
  
  //全回答の取得
  var formResponses = form.getResponses()
  
  //1件目の回答を取得
  var itemResponses = formResponses[0].getItemResponses()
  
  //1件目の回答の1つ目の質問と回答を取得
  var title = itemResponses[0].getItem().getTitle()
  var response = itemResponses[0].getResponse()

  Logger.log('質問内容 = ' + title)
  Logger.log('回答内容 = ' + response)
} 

質問内容 = 日付
回答内容 = 2021-01-10

全回答内容の取得

回答数、質問数はlengthで求められるので、全回答内容を表示するサンプルです。

function formObject() {
  //フォームID
  var formId = '1234567890abcdefghijklmnopqrstuvwxyz'

  //フォームオブジェクトの取得
  var form = FormApp.openById(formId)
  
  //全回答の取得
  var formResponses = form.getResponses()
  
  //i件目の回答を取得
  for (var i = 0; i < formResponses.length; i++)  {
    //回答を格納する配列
    var arr = []
    //i件の回答を取得
    var itemResponses = formResponses[i].getItemResponses()

    for (var j = 0; j < itemResponses.length; j++)  {
      //i件目の回答のj番目の質問と回答を取得
      var title = itemResponses[j].getItem().getTitle()
      var response = itemResponses[j].getResponse()
      arr[j] = '【' + title + '】 ' + response
    }
    Logger.log(i+1 + '件目の回答 = ' + arr)
  }
}

1件目の回答 = 【日付】 2021-01-10,【時刻】 10:10,【氏名】 象と散歩
2件目の回答 = 【日付】 2021-01-11,【時刻】 11:11,【氏名】 キリンと散歩
3件目の回答 = 【日付】 2021-01-12,【時刻】 12:12,【氏名】 イルカと散歩

フォームから回答内容が一致するものを探す

formの回答内容検索して回答内容が一致するものを探すサンプルプログラムとなります。(2022/6/19追記)

一致させる内容については、サンプルを簡単にするために変数としています。

    一致条件
  • 質問内容='氏名'
  • 回答内容='象と散歩'

変数で指定した条件と一致する回答があれば、質問内容と回答内容を出力して、一致するものがなければ '一致なし' と出力します。

複数一致するものがあれば複数回出力されます。

function formObject() {
  //一致条件
  var questionTitle = '氏名'
  var costomerName ='キリンと散歩'

  //フォームID
  var formId = '1234567890abcdefghijklmnopqrstuvwxyz'

  //フォームオブジェクトの取得
  var form = FormApp.openById(formId)
  
  //全回答の取得
  var formResponses = form.getResponses()

  var ans = 0 //一致する回答を見つけた場合に1にする 
  for (var i = 0; i < formResponses.length; i++)  {
    //i件目の回答を取得
    var itemResponses = formResponses[i].getItemResponses()

    for (var j = 0; j < itemResponses.length; j++)  {
      //i件目の回答のj個目の質問と回答を取得
      var title = itemResponses[j].getItem().getTitle()
      var response = itemResponses[j].getResponse()

     //質問項目が questionTitle で 回答内容が costomerName かを確認
      if (title == questionTitle && response == customerName) {
        Logger.log('質問内容 = ' + title)
        Logger.log('回答内容 = ' + response)
        ans = 1
      }
    }
  }
  if (ans == 0) {
    Logger.log('一致なし')
  }
}

タイムスタンプを指定して回答を取得

getResponses(タイプスタンプ)でタイムスタンプが一致するフォームの回答を取得できます。

以下の例は、シートのタイプスタンプ(A列)と一致する回答編集用のURLを取得してシートのE列に書き込む例です。シートIDはフォームIDと同様に取得して変更してください。

function formObject() {
  //フォームID
  var formId = '1234567890abcdefghijklmnopqrstuvwxyz'
  //シートID
  var sheetId = 'abcdefghijklmnopqrstuvwxyz1234567890'
  //シート名
  var sheetName = 'フォームの回答 1'
 
  //フォームオブジェクトの取得
  var form = FormApp.openById(formId)
  var formResponses = form.getResponses()

  //シートオブジェクトの取得
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)
  var lastRow = sheet.getLastRow() // 最終行の取得

  //シートの2行目から最終行までを処理
  for (var i =2; i <= lastRow; i++)  {
    //A列からタイムスタンプを取得
    var timeStamp = sheet.getRange('A' + i).getValue()
  
    //タイムスタンプが一致するフォームの回答を取得
    var formResponses = form.getResponses(timeStamp)
    //編集用URLの取得
    var editUrl = formResponses[0].getEditResponseUrl()

    //編集用URLをハイパーリンク形式に
    var strEditUrl = '=HYPERLINK("' + editUrl + '","編集用URL")'

    //編集用URLをE列に書き込む
    sheet.getRange('E' + i).setValue(strEditUrl)
  }
}

シートのA列にあるタイムスタンプを取得して変数timeStampに格納して、タイムスタンプが一致する回答を取得しているのがこの部分です。

var formResponses = form.getResponses(timeStamp)

タイムスタンプが一致した回答は配列の0番目に格納されています。getEditResponseUrl()で編集用URLが取得できます。

var editUrl = formResponses[0].getEditResponseUrl()

タイムスタンプはミリ秒まであるので通常は問題ないと思いますが、タイムスタンプが一致する回答が複数あった場合の挙動はわかりません。

シートが下記のように更新されます。回答編集用URLは長いのでハイパーリンクにしました。

Google Sheets(回答編集URLを追加)

GASの基礎を学べる参考図書

ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。

詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。

Udemy オススメ講座

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

講師:事務職たらこ

印象に残りやすい手書き風スライドを用いGASの基本的なプログラミングを気軽に学ぶことができる。本講座でGASを活用した自動化ができるレベルにはなれないが、基礎としては十分。

Post Date:2021年1月11日 

GASでGoogleフォームの値を取得する(トリガー編)

ゾウでもわかる Google Apps Script

Googleフォームでの回答内容をGAS(Google Apps Script)で参照する方法です。

Googleフォームの値を取得するには2種類の方法があります。

  1. フォームが実行されたときに値を取得
  2. フォームを指定して回答内容を取得

今回は、「フォームが実行されたときに値を取得」についての説明です。


Googleフォーム実行時に値を取得

Apps Scriptはトリガーを設定することができるのでフォームが送信されたときに実行することができます。

スクリプトは、フォームから直接か、

GoogleフォームでGoogle Scriptを書く

回答先のシートから記述します。

 GoogleシートでGoogle Scriptを書く

トリガーの設定

トリガーの設定は、スクリプトの左側にあるメニューの時計のアイコンからです。

スクリプトからトリガーを設定

下例では、後述するサンプルプログラムの getFormValue を選択しています。イベントの種類は「フォーム送信時」を選んでください。

トリガーの設定 

function(e)とは?

フォーム送信時のトリガーで関数が実行されると、フォームの回答内容が関数の()内に指定した引数に渡されます。

function(e) のように引数をeとしている例が多いですが、これはイベントオブジェクトの表記に基づいているからだと思いますが、別に引数は e でなくても問題ありません。


連想配列で取得する(namedValues)

namedValue を使うと {キー:} という形でデータを取得できます。pythonではディクショナリー(辞書型)と呼ばれている配列です。

実際のデータで説明するのがわかりやすいと思います。

① 下記のフォームで送信します

サンプル フォーム

② トリガーでフォーム送信時に getFormValue を実行するように設定

getFormValue関数には、下記のコードを記載します。

namedValues でキーに質問名、値に回答内容を連想配列として取得したものをログに出力します。

function getFormValue(e) {
  console.log(e.namedValues)
}

フォームの質問項目は、日付、時刻、氏名ですが、namedValues で取得すると、時刻、氏名、日付の順番となっています。タイムスタンプは、回答を送信したときの時間です。

{ '時刻': [ '11:11:00' ],
  '氏名': [ 'キリンと散歩' ],
  '日付': [ '2021/01/11' ],
  'タイムスタンプ': [ '2021/01/10 12:25:19' ] }

質問名で値を取得する

namedValues['質問名'][0]

で、質問の回答を取得できます。[0]は、質問名の0番目(最初)の値を意味しますが、値がひとつしかないので省略可能です。

下記のコードで、質問名が氏名の内容を出力します。

function getFormValue(e) {
  var name = e.namedValues['氏名'][0]
  console.log('氏名 = ' + name)
}

氏名 = キリンと散歩

一次元配列として取得する(values)

values を使うと一次元配列で取得できます。

function getFormValue(e) {
  console.log(e.values)
}

こちらはフォームの順番に従っています。

[ '2021/01/10 12:25:19', '2021/01/11', '11:11:00', 'キリンと散歩' ]

namedValuesでのサンプルコードと同じく氏名の値を取得するのであれば、4番目の項目となるのでvalues[3]とします。

※配列は0からの指定なので、上記のデータであれば

  • values[0]    タイムスタンプ
  • values[1]    日付
  • values[2]    時刻
  • values[3]    氏名

となります。

function getFormValue(e) {
  var name = e.values[3]
  console.log('氏名 = ' + name)
}

氏名 = キリンと散歩

通常の配列なので、lengthを使ってforループで回して全ての項目を出力することも可能です。

function getFormValue(e) {
  for (var i = 0; i < e.values.length; i++)  {
    console.log(e.values[i])
  }
}

2021/01/10 12:25:19
2021/01/11
11:11:00
キリンと散歩

分割代入で変数にフォーム値を代入

分割代入を使うと配列から値を取り出して個別の変数に代入することが可能です。

function getFormValue(e) {
  var [timeStamp, date, time, name] = e.values
  console.log(name)
}

キリンと散歩

実行する上での注意事項

フォームの値を取得する関数は、スクリプトエディタからは実行できません。

トリガー起動関数を手動で実行する

getFormValueをスクリプトから実行すると、eの引数に何も渡されていないので、e.namedValues で 'namedValues' of undefined とエラーとなります。


「送信後に編集」は変更項目のみ取得可能

フォームの設定で「送信後に編集」をオンにしておくと、回答者は回答を編集をすることができます。

回答を編集して送信された場合は、変更された内容しか取得できません。何も回答を変更せずに送信されると取得できる項目はタイムスタンプだけとなります。

function getFormValue(e) {
  console.log(e.namedValues)
  console.log(e.values)
}

{ '氏名': [ '' ],
  'タイムスタンプ': [ '2021/01/10 12:50:40' ],
  '時刻': [ '' ],
  '日付': [ '' ] }

[ '2021/01/10 12:50:40', '', '', '' ]

GASの基礎を学べる参考図書

ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。

詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。

Udemy オススメ講座

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

講師:事務職たらこ

印象に残りやすい手書き風スライドを用いGASの基本的なプログラミングを気軽に学ぶことができる。本講座でGASを活用した自動化ができるレベルにはなれないが、基礎としては十分。

象と散歩:人気の投稿(過去7日間)