はじめに
お疲れさまです。
みなさまどんなGWをお過ごしでしたか。
私は全て仕事で終わりました😢
私のGWはいつやってくるのか・・・。
悲しい話はここまでにして
今回はGoogleAppsScript(GAS) と ChatGPTを利用して
「Googleフォームに添付されたPDFファイル名の自動変換」
をやってみました。
最後まで是非お付き合いください。
作成しようとした経緯
長くなったため読み飛ばしてOKです。
興味ないぜ!という方は作成手順からご覧ください。
背景説明
業務の一つに、全店舗を対象に棚卸を実施していただき
データの提出を依頼するというのがあります。
元々紙面の提出でしたが、現在はGoogle Foamで行っています。
手順はまず、各店舗にてデータを作成・入力いただき
PDFファイルへ変換。
その後、フォームにPDFデータを添付していただく、という運用です。
以前は全店舗から紙面で回収、確認を行っていたため
PDFファイルで提出という運用に変更してからは
デジタル化が進んだと思います。
しかし、新たな問題が発生します。
それはPDFファイルの「ファイル名がめちゃくちゃ」という問題です。
「店番+店舗名.pdf」のファイル名で投稿するよう案内していますが、
「dsfdsfhdskfjs.pdf]のような名称で投稿する店舗が多いです。
というのも、店舗の担当者の中にパソコンが苦手という人が多いです。
そのため、ファイル名の変更方法がわからずそのまま投稿。
なんてことがありがちです。
起こっていた問題点
ファイル名がめちゃくちゃになることで
以下の問題が発生していました。
-
ファイルの順番がバラバラになるためわかりにくい
-
どこの店舗のデータか、ファイルを開くまでわからない
-
ファイル名を修正する場合、手入力となるため時間がかかる
これらの問題を解決するために、
投稿したPDFデータを自動変換できないかな
と考えたのが今回のきっかけです。
作成手順
まずはChatGPTに聞いてみる
解決するためにまず頼ったものが「ChatGPT」です。
なんとかなれ-!そんな思いで質問してみました。
するとこんな回答が
前提条件となるGoogleフォームは以下のようGoogleスプレッドシートに保存しています。
(質問事項は一部変更しています)
さらにスクリプトが表示されました。
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) : '';
}
早速やってみましょう
ファイル名一括変更!スクリプト作成手順
スクリプトについては、GASに貼付を行います。
手順については以下の通りです。
①拡張機能から「Apps Script」を選択
②上のスクリプトをそのまま貼付、保存をします(黄色マーカー)
その後row[]の中に数字を入力しますが、以下の点に注意です。
row[ ]の数字注意
A列は0となります。(スプレッドシートは0から数え始める)
この場合、店番は[2],店名は[3],ファイルは[6]になります
入力完了後、スクリプトを実行アイコンをクリックすると・・・
おお!思い描いたファイル名に変更できました!
さらに改良したい!もう一度相談してみた
しかし、上記のスクリプトは「既に投稿されているファイル名の変更」のみです。
せっかくだから、「新しい回答も自動で名前変更したい!」と考えたところ
ChatGPTが素敵な提案をしてくれました。
早速お願いしてみました。すると・・・
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);
}
}
上位で作成したスクリプトの下に張り付けを行い
以下のようにトリガーを設定する必要があるようです。
新しい回答を自動リネーム!トリガー設定手順
トリガーの設定は以下の通りです。
①左メニューからトリガーを選択
②右下「トリガーを追加」を選択
③以下のように設定!保存を選択
これで完了です!
Googleフォームから新規に登録したPDFデータが
自動でリネームされるようになりました!
これで業務課題を1つ解決できそうです!
感想
課題に関してどうしようと一人で考えるよりも
まずはChatGPTに聞いてみる!これが大事だと感じました。
これからのルーティンになりそうですね(笑)
GASは色々応用が利きそうなので、またいいスクリプトが作成できたら
記事にしたいなと思います。
それでは次回の記事でお会いしましょう!ありがとうございました!
おまけ ChatGPTにも不可能なことはある
制作後、更なる改善案として「投稿者のアドレス名をファイル名に表示したい」と
考えました。(店舗名+店名+実験太郎.pdf のイメージ)
ChatGPTに聞いてみたところ・・・
なんてことでしょう、不可能との回答でした。
しかし、代替案を用意してくれるのがChatGPTです。
回答者名を入力する欄を作成し、上記のスクリプトを利用する・・・
これであれば解決できそうです。
多角的な視点で考えることが大切だとわかりますね・・・。
ここまで読んでいただきありがとうございます!