【GAS】Googleフォームの回答を任意のスプレッドシートに振り分ける

https://qiita.com/advent-calendar/2021/google-apps-script

##概要
クリスマスパーティーの参加希望者をGoogleフォームで募り、名簿を作成することにしました。人以外も参加するので種族に応じて回答を振り分けられるようにしました。(実際にはコピーの振り分けであり、デフォルトの保存先のスプレッドシートは残り続けます。)
###仕様
1. Googleフォームで回答を受け取る度に内容を取得
2. 回答内容に応じてデフォルトの保存先から任意のスプレッドシートにコピー

#下準備
Googleフォームとスプレッドシートの準備が出来ている場合は読み飛ばしてください。

1. フォームの作成
![form1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651895/c0e95268-aafe-dfa7-9ed0-6ed41327029c.png)
画像の内容で作成しました。質問事項は「姓、名、人か(yes/no)、馬か(yes/no)」の4つです。今回は「人か、馬か」の質問に対する回答をもとに姓名を[1,人 2,馬 3,ケンタウロス 4,未確認生物]というシートに振り分け名簿を作成します。

2. 回答の保存先を選択
フォームの「回答」タブから回答内容を記録するスプレッドシートを選択します。
![form2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651895/26ed9d52-4c7b-96ca-3bb2-deaa07fbc9c2.png)
選択したスプレッドシートにAppスクリプトを追加します(後述)。

3. 回答を振り分けるスプレッドシートを作成
![sheet1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651895/278ae682-373e-e5b5-1ed9-b79f0e5510f6.png)
画像の内容で作成しました。

4. 振り分け先のスプレッドシートのIDを取得
取得方法は対象のスプレッドシートのURL一部を抜き出すだけです。以下の記事を参考にしてください。スクリプトを記述する際に使用します。
https://qiita.com/n0bisuke/items/67afb8ad50d20fba0ad3

#スクリプトの記述
##記述場所
下準備2の回答の保存先(フォームとリンクしたスプレッドシート)を開き拡張機能から「Apps Script」を選択すると新しいタブでコードを記述する画面が開きます。
![script1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651895/b1f4ab16-8b16-b429-47d0-92555715702c.png)
##コード

```javascript
function autoMove(e) {
  //スプレッドシートID
  let ss_id = '[振り分け先スプレッドシートのIDをここに入力]';
  
  //Googleフォームの質問の項目
  let q1 = e.namedValues["姓"];
  let q2 = e.namedValues["名"];
  let q3 = e.namedValues["あなたは人ですか？"];
  let q4 = e.namedValues["あなたは馬ですか？"];

  //回答のコピー先スプレッドシートをIDで開き、任意のシートを名前で指定
  var sh1 = SpreadsheetApp.openById(ss_id).getSheetByName('人');
  var sh2 = SpreadsheetApp.openById(ss_id).getSheetByName('馬');
  var sh3 = SpreadsheetApp.openById(ss_id).getSheetByName('ケンタウロス');
  var sh4 = SpreadsheetApp.openById(ss_id).getSheetByName('未確認生物');

  //それぞれのシートの最終行を取得
  var sh1_last = sh1.getLastRow();
  var sh2_last = sh2.getLastRow();
  var sh3_last = sh3.getLastRow();
  var sh4_last = sh4.getLastRow();

  //回答を条件によって任意のシートに振り分ける
  //getRange(x,y)でスプレッドシートのx行y列のセルを指定。ここでは行を「上で取得した最終行」+1としている
  //setValue(hoge)で指定したセルの値を変更
  if (q3 == 'はい' && q4 == 'いいえ'){
    sh1.getRange(sh1_last + 1, 1).setValue(q1);
    sh1.getRange(sh1_last + 1, 2).setValue(q2);
  }
  else if (q3 == 'いいえ' && q4 == 'はい'){
    sh2.getRange(sh2_last + 1, 1).setValue(q1);
    sh2.getRange(sh2_last + 1, 2).setValue(q2);
  }
  else if (q3 == 'はい' && q4 == 'はい'){
    sh3.getRange(sh3_last + 1, 1).setValue(q1);
    sh3.getRange(sh3_last + 1, 2).setValue(q2);
  }
  else if (q3 == 'いいえ' && q4 == 'いいえ'){
    sh4.getRange(sh4_last + 1, 1).setValue(q1);
    sh4.getRange(sh4_last + 1, 2).setValue(q2);
  }
}
```

#スクリプトの実行
GASは自動保存されないのでご注意ください。このスクリプトはトリガーを設定することで実行されます。実行時にフォームの回答内容を引数eで受け取るようになっています(eは任意の文字で大丈夫です)。トリガー設定はApps Script編集画面の左コラムの時計アイコンから行います。
![trigger1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651895/a0a760cb-935c-be9f-44a6-caff72aea324.png)
トリガーの設定は「イベントの種類を選択」を「フォームの送信時」に設定します。その他はデフォルトで大丈夫です。
![trigger2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651895/94153f3c-5ccc-b486-fb4b-0841f81aaa3b.png)
保存を押すとセキュリティ確認が表示されるので許可をします。以上で完成です。
フォームに回答が記録されるとスクリプトが実行され自動で振り分けが行われます。

#最後に
今回は1つのスプレッドシートファイル内に複数のシートを用意しましたが、複数のファイルに振り分けることも可能です。その際はファイルごとのIDを取得すれば上記のスクリプトを少し改変するだけで実行できると思います。
また、質問項目を質問のタイトルで取得していますが、他にも様々な取得方法があるので気になる方は調べてみてください。例えば質問を番号で取得するとforループで回すことができるようになります。

#参考文献
https://vba-gas.info/gas-googleform-1
https://walking-elephant.blogspot.com/2021/01/gas.namedvalues.html
https://uxmilk.jp/25841