Googleフォームで取得した写真の名前を自動で変更（リネーム）する

# はじめに

`Googleフォーム`で回収した写真って、
ファイル名が、`{元のファイル名} – {ユーザ名}.{元のファイル拡張子}`になっていて、
結局何の写真だ！？って困ってしまったことがあったので、
フォーム回収時にさらりとファイル名を変更するGASを組んでみました^^
つまづいたところと解決策も記載したので、参考になれば幸いです。

# 参考記事
・デプロイするまでの方法とベースになるコードが分かりやすい

https://qiita.com/fuku_up/items/0a1f2c916c4f033ca130

・複数ファイルをアップロードする際のコードが分かりやすい

https://benri-life.com/programming%E2%88%92learning/google-apps/791/

# 参考にしたコード

<details>
<summary>こちらをクリック</summary>

```JS

function myFunction(e) {
  var itemResponse;
  var fileName;
  var movie;
  
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();
  
  // お名前の回答結果を取得する
  itemResponse = itemResponses[0];
  fileName = itemResponse.getResponse() + '_' + dateToStr24HPad0(new Date(), 'YYYYMMDDhhmmss');
  
  // 投稿動画の回答結果を取得する
  itemResponse = itemResponses[1];
  movie = DriveApp.getFileById(itemResponse.getResponse());
  movie.setName(fileName);
}

/**
 * 日付をフォーマットする
 */
function dateToStr24HPad0(date, format) {
    
  if (!format) {
  // デフォルト値
    format = 'YYYY/MM/DD hh:mm:ss'
  }
    
  // フォーマット文字列内のキーワードを日付に置換する
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
  format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
  format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
  format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
  format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
    
  return format;
}
```
</details>

# 実際に作成したコード
<details>
<summary>こちらをクリック</summary>

```JS
function myFunction(e) {
  var itemResponse;
  var fileName;
  var photo1;
  var photo2;
  var no = 1;    // ファイルアップロード時の連番
  
  //回答のオブジェクトを取得
  var itemResponses = e.response.getItemResponses();
  
  // お名前の回答結果を取得する
  itemResponse = itemResponses[1];
  fileName = itemResponse.getResponse() + '_' + dateToStr24HPad0(new Date(), 'YYYYMMDDhhmmss');
  
  // ファイルの回答結果を取得する
  itemResponse = itemResponses[31];
  itemResponse.getResponse().forEach(function( uploadFile ) {
    photo1 = DriveApp.getFileById(uploadFile);
    var ext = getExt(photo1.getName());
    photo1.setName(fileName + '_' + no + '.' + ext);
    no++;
  });

// ファイルの回答結果を取得する
  itemResponse = itemResponses[32];
  itemResponse.getResponse().forEach(function( uploadFile ) {
    photo2 = DriveApp.getFileById(uploadFile);
    var ext = getExt(photo2.getName());
    photo2.setName(fileName + '_' + no + '.' + ext);
    no++;
  });
}

// フォーマットする自作関数
function dateToStr24HPad0(date, format) {
    
  if (!format) {
  // デフォルト値
    format = 'YYYY/MM/DD hh:mm:ss'
  }
    
  // フォーマット文字列内のキーワードを日付に置換する
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
  format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
  format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
  format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
  format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
    
  return format;
}

// 拡張子を取得
function getExt(filename) {
    return filename.match(/[^.]+$/);
}

```
</details>


# つまづいたところ
とはいえ、初心者なので、つまづいたところと、
そのエラーの解決策についてご紹介します！

## 実行を押してもエラーになってしまう
コードは合っているのになぜ、エラーになるんじゃあ！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/0d9a74ea-4bd4-d8ef-be69-5f0e74f5b6b3.png)

### 解決策
冒頭のコードなのですが、
`function myFunction(e) {`
フォーム送信時のトリガーで関数が実行されるようになっているので、
実行を押してやろうとしても、エラーになっちゃう。とのことでした。
実際にフォームを送信したら、問題なく実行されたので、
動くかどうか見たい時は、実際にフォームを送信してください^^

## 返すオブジェクトがないですよ
何か分かんないけど、調べると返すものがないですよと言われているらしい。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/ebe07220-02d8-cbe5-7abe-696610cbd1e5.png)

### 解決策
参考記事のコードをそのままコピペしたので、
私が実際につくったフォームと拾ってくるところが違うのが原因でした。
なので、`itemResponse = itemResponses[ ];`の[ ]の番号を変えました^^

![無題のプロジェクト-プロジェクト編集者-Apps-Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/ecd9e1c3-fac0-3d8e-a957-99dc2104b215.png)

:::note warn
オブジェクトの配列は0から数えるので、1引いた数字を入れてね！
:::

# もともとのコードから工夫したところ
写真を回収する設問が2つあったので、
`Photo1`と`Photo2`で宣言してみました。
![無題のプロジェクト-プロジェクト編集者-Apps-Script (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/0da9a832-639b-dac0-f0e0-0c91291cf378.png)

# まとめ
自分、やればできるじゃん！！！www
同じことをやってみたいなあと思っている方の
力になれば幸いです。