ファイル名変更不要！？Googleフォームで投稿されたPDFファイルのファイル名を自動変更！

# はじめに

お疲れさまです。
みなさまどんなGWをお過ごしでしたか。

私は全て仕事で終わりました😢
私のGWはいつやってくるのか・・・。

悲しい話はここまでにして
今回は**GoogleAppsScript（GAS）** と **ChatGPT**を利用して
**「Googleフォームに添付されたPDFファイル名の自動変換**」
をやってみました。
最後まで是非お付き合いください。

# 作成しようとした経緯
長くなったため読み飛ばしてOKです。
興味ないぜ！という方は作成手順からご覧ください。



### 背景説明

業務の一つに、全店舗を対象に棚卸を実施していただき
データの提出を依頼するというのがあります。

元々紙面の提出でしたが、現在はGoogle Foamで行っています。

**手順はまず、各店舗にてデータを作成・入力いただき
PDFファイルへ変換。
その後、フォームにPDFデータを添付していただく、という運用です。**

以前は全店舗から紙面で回収、確認を行っていたため
PDFファイルで提出という運用に変更してからは
デジタル化が進んだと思います。

しかし、新たな問題が発生します。
それはPDFファイルの「**ファイル名がめちゃくちゃ**」という問題です。

「店番+店舗名.pdf」のファイル名で投稿するよう案内していますが、
「dsfdsfhdskfjs.pdf]のような名称で投稿する店舗が多いです。

というのも、**店舗の担当者の中にパソコンが苦手**という人が多いです。
そのため、ファイル名の変更方法がわからずそのまま投稿。
なんてことがありがちです。

### 起こっていた問題点
ファイル名がめちゃくちゃになることで
以下の問題が発生していました。

+ **ファイルの順番がバラバラになるためわかりにくい**

+ **どこの店舗のデータか、ファイルを開くまでわからない**

+ **ファイル名を修正する場合、手入力となるため時間がかかる**

これらの問題を解決するために、
**投稿したPDFデータを自動変換できないかな**
と考えたのが今回のきっかけです。

# 作成手順

### まずはChatGPTに聞いてみる


解決するためにまず頼ったものが「**ChatGPT**」です。
なんとかなれ－！そんな思いで質問してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/13d6ac2d-4c25-40c5-8cc1-4efa87b6506e.png)

するとこんな回答が

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/dd5e55d6-079c-4801-8e63-f6fcab8a495e.png)

前提条件となるGoogleフォームは以下のようGoogleスプレッドシートに保存しています。
（質問事項は一部変更しています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/d257eb60-d1a8-4cb3-b4a1-440bbd224d9d.png)




さらにスクリプトが表示されました。

```ruby: スクリプトを貼り付ける（例）
javascript

function renameUploadedFiles() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォームの回答 1"); // シート名を確認
  const data = sheet.getDataRange().getValues();

  // 1行目はヘッダー
  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    const timestamp = row[0];
    const storeCode = row[1]; // 店番（列を確認）
    const storeName = row[2]; // 店名（列を確認）
    const fileUrls = row[3];  // ファイルアップロード欄（列を確認）

    if (!fileUrls || fileUrls === '') continue;

    const urls = fileUrls.toString().split(', ');
    for (const url of urls) {
      const fileId = url.match(/[-\w]{25,}/)[0];
      const file = DriveApp.getFileById(fileId);
      const newFileName = `${storeCode}${storeName}${getFileExtension(file.getName())}`;
      file.setName(newFileName);
    }
  }
}

function getFileExtension(fileName) {
  const dotIndex = fileName.lastIndexOf('.');
  return dotIndex !== -1 ? fileName.substring(dotIndex) : '';
}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/0d207abe-966c-4504-9055-8238368f57d4.png)

早速やってみましょう

### ファイル名一括変更！スクリプト作成手順
スクリプトについては、**ＧＡＳに貼付を行います**。
手順については以下の通りです。

**①拡張機能から「Apps Script」を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/c3979044-d613-4173-ab42-4f0c76a2f117.png)

**②上のスクリプトをそのまま貼付、保存をします（黄色マーカー）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/e812f536-b1f9-431b-83b9-cd0a958f4564.png)

その後row［］の中に数字を入力しますが、以下の点に注意です。


:::note warn
row[　]の数字注意
A列は0となります。（スプレッドシートは0から数え始める）
この場合、店番は[2]，店名は[3]，ファイルは[6]になります
:::

入力完了後、スクリプトを実行アイコンをクリックすると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/7f5f005e-1d51-40c7-b451-32dfe23d32a4.png)

おお！思い描いたファイル名に変更できました！

### さらに改良したい！もう一度相談してみた

しかし、上記のスクリプトは「**既に投稿されているファイル名の変更**」のみです。
せっかくだから、「新しい回答も自動で名前変更したい！」と考えたところ
ChatGPTが素敵な提案をしてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/307d0eee-a684-4b19-ba81-deb0db38a923.png)

早速お願いしてみました。すると・・・



```ruby:先ほどのスクリプトはそのままに、以下のトリガーを追加します
javascript
コピーする
編集する
function onFormSubmit(e) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォームの回答 1");
  const row = e.values; // 新しく追加された行のデータ

  const storeCode = row[2]; // C列：店番
  const storeName = row[3]; // D列：店名
  const fileUrls = row[6];  // G列：ファイルURL

  if (!fileUrls || fileUrls === '') return;

  const urls = fileUrls.toString().split(', ');
  for (const url of urls) {
    const fileIdMatch = url.match(/[-\w]{25,}/);
    if (!fileIdMatch) continue;

    const fileId = fileIdMatch[0];
    const file = DriveApp.getFileById(fileId);
    const newFileName = `${storeCode}${storeName}${getFileExtension(file.getName())}`;
    file.setName(newFileName);
  }
}
```
上位で作成したスクリプトの下に張り付けを行い
以下のように**トリガーを設定する必要がある**ようです。

### 新しい回答を自動リネーム！トリガー設定手順

トリガーの設定は以下の通りです。

**①左メニューからトリガーを選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/66d9e93a-20f6-4d8a-b8b8-60c641e4b2bc.png)

**②右下「トリガーを追加」を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/6dbaf609-406b-4a8e-a119-5684b77c8873.png)

**③以下のように設定！保存を選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/fd91b93a-8d00-4b29-b5b2-35c3e9e3a873.png)

これで完了です！
**Googleフォームから新規に登録したPDFデータが
自動でリネームされるようになりました！**

これで業務課題を1つ解決できそうです！

## 感想
課題に関してどうしようと一人で考えるよりも
**まずはChatGPTに聞いてみる**！これが大事だと感じました。
これからのルーティンになりそうですね（笑）

GASは色々応用が利きそうなので、またいいスクリプトが作成できたら
記事にしたいなと思います。

それでは次回の記事でお会いしましょう！ありがとうございました！

## おまけ　ChatGPTにも不可能なことはある

制作後、更なる改善案として「**投稿者のアドレス名をファイル名に表示したい**」と
考えました。（店舗名+店名+実験太郎.pdf のイメージ）

ChatGPTに聞いてみたところ・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/a312ec91-c265-459c-a336-b62c6be59cb9.png)


なんてことでしょう、不可能との回答でした。
しかし、代替案を用意してくれるのがChatGPTです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045820/7aa8fe30-4618-4ed0-8bd9-eba20ba1797a.png)
（例で本名が表示されたためモザイク）

回答者名を入力する欄を作成し、上記のスクリプトを利用する・・・
これであれば解決できそうです。

多角的な視点で考えることが大切だとわかりますね・・・。
ここまで読んでいただきありがとうございます！