Google Apps Script(GAS)でGoogleフォーム送信時にデータを取得する方法３通り

#1.概要
Googleフォームの回答を取得して、Google Apps Script（GAS）でデータの変換やslack送信などをすることができる。
その際のデータの取得方法は何通りかあるものの、私自身GASに触れ始めた頃に迷った記憶があるため、この記事にまとめていく。

#2.以下のフォームを例とする。
![スクリーンショット 2020-08-29 19.09.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390448/abc5a8cb-da9c-d013-9477-2015385ae7d9.png)
今回は、名前は？という質問の答えを取得する。

#3-1.Googleフォームのスクリプトエディタから取得
Googleフォームにはスクリプトエディタが存在する。
![スクリーンショット 2020-08-29 19.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390448/b03bd6b1-e41b-d528-935e-45ce7b4a87a3.png)

##3-1-1.スクリプト
スクリプトエディタに書く内容は以下。

```javascript:GAS
function myFunction(e) {
  const applicant = "";
  const itemResponse = e.response.getItemResponses();
  let name = "";

for (let i = 0; i < itemResponse.length; i++){    
    const formData = itemResponse[i];
    const title = formData.getItem().getTitle();
    const response = formData.getResponse();
    
    switch (title) {
      case "名前は？":
        name = response;
        break; 
       default:
        break;
    }
  }
  console.log(name);
}

```
##3-1-2.トリガー
トリガーは以下のように設定した。
実行する関数：myFunction
イベント：「フォームから」「フォーム送信時」

##3-1-3.解説
`console.log(name);`
により、ログとしてnameが出力されるようにした。
コアラと回答したものが、以下のように出力されたので、データが取得できたとわかる。

質問のタイトル（今回の場合は「名前は？」)と、`case "名前は？"`を同じにすることが肝である。
`case "名前は？":
        name = response;
        break; `
を複数繰り返すことで、複数の質問文の答えをそれぞれ取得することができる。

![スクリーンショット 2020-08-30 21.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390448/ff5b87cc-5377-2127-1ee2-0e60fc29ff48.png)

#3-2.Googleフォームに紐付けたスプレッドシートから取得①
Googleフォームに紐付いた、スプレッドシートのスクリプトエディタにコードを書くことにする。
![スクリーンショット 2020-08-30 22.04.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390448/5342217e-1b91-5b60-663d-07c1b66db1ec.png)
このスプレッドシートのマークから飛べるところである。
新しく作っても既存のシートを利用してもどちらでも良い。

![スクリーンショット 2020-08-30 22.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390448/c1198cba-21b3-b6bf-5c06-aad55d0a36e2.png)

##3-2-1.スクリプト
スクリプトエディタに書く内容は以下。

```javascript:GAS
function myFunction(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const Sheet = ss.getSheetByName("フォームの回答 1");
  
  const lastRow = Sheet.getLastRow()
  const lastColumn = Sheet.getLastColumn()
  const data = Sheet.getRange(lastRow,1,1,lastColumn).getValues();
  const name = data[0][1];
  console.log(name);
}
```

##3-2-2.トリガー
トリガーは以下のように設定した。
実行する関数：myFunction
イベント：「スプレッドシートから」「フォーム送信時」

##3-2-3.解説
`console.log(name);`
により、ログとしてnameが出力されるようにした。
コアラ2と回答したものが、以下のように出力されたので、データが取得できたとわかる。

`const ss = SpreadsheetApp.getActiveSpreadsheet();`
今紐づいているスプレッドシートからデータ取得。
`const Sheet = ss.getSheetByName("フォームの回答 1");`
「フォームの回答 1」という名前のシートをSheetって命名。
`const data = Sheet.getRange(lastRow,1,1,lastColumn).getValues();`
Sheetの最終行を一行、dataっていう二次元配列にいれる。
![スクリーンショット 2020-08-30 22.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390448/0cc2c031-987a-a536-f91b-fc71aa663164.png)

#3-3.Googleフォームに紐付けたスプレッドシートから取得②

##3-3-1.スクリプト
スクリプトエディタに書く内容は以下。

```javascript:GAS
function myFunction(e){
  const name = e.values[1];
  console.log(name);
}
```

##3-3-2.トリガー
トリガーは以下のように設定した。
実行する関数：myFunction
イベント：「スプレッドシートから」「フォーム送信時」

##3-3-3.解説
`console.log(name);`
により、ログとしてnameが出力されるようにした。
コアラ3と回答したものが、以下のように出力されたので、データが取得できたとわかる。

`(e)`で、フォームの回答を取得できる。
`const timestamp = e.values[0];`
で、タイムスタンプを取得できる。

![スクリーンショット 2020-08-30 23.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390448/7900b454-5dd1-3521-28ca-95b96497b57d.png)

#4.まとめ

いろいろな方法が他にもあると思いますが、以上３通りをまとめました。
ぜひ参考にしてください！！