2020年11月24日火曜日

Googleフォームのファイルアップロードデータを抽出し、ファイル名を変更して特定フォルダに一括保存する(Google Apps Script)

 Google フォームのファイルアップロードを使ってアップロードされたファイルは、下図のように、「ファイル名 - 名前(Googleアカウントのプロフィール).ファイルの拡張子」という名前になります。


しかしながら、
  1. 申請する人が、代理かもしれない
  2. いつ申請したかファイル名だけでは判別しづらい
という問題があり、ファイル名について

年-月-日_登録者名_ファイル名 - 申請者名(Googleアカウントのプロフィール).ファイルの拡張子

のように、ファイル名の目視だけでもう少しはっきりとわかるようにできたら便利です。
下図はその例です。
  • 登録者名1:テスト2
    • 3ファイル:test1.xlsx, test2.xlsx, test3.xlsx
  • 登録者名2:ほげほげ
    • 1ファイル: test.xlsx
これを、Google Apps Script で実装してみます。
ただし説明を容易にするために、極めてシンプルな構造にしています。

STEP 1. Googleフォームを作成する



今回は例のため、項目は2つ(名前、ファイルアップロード)にしています。メールアドレスの収集なども行いません。ただし、ファイルアップロードは、申請者の Googleアカウントのマイドライブ直下に一旦アップロードする手法になるため、Googleアカウントのログインが必須になります。

作成し終わったら、「回答」タブにある、「スプレットシートの作成」ボタンをクリックし、回答内容を Googleスプレットシートに保存できるようにします。



STEP 2. 一括保存するフォルダを作成


Googleドライブ内に、フォルダを作成します。
ここではサンプルとして、Googleフォームを作成したフォルダ直下に「Attached Documents」というフォルダを作成します。



STEP 3. Google Apps Script を用意する


回答先 Googleスプレットシートを開き、ツールメニューから「スクリプトエディタ」を開きます。


すると上図のようなサンプルコードが出てきます。
これらのコードはすべて削除した上で、下記のリンク先を開いて出てきたテキストを「すべて選択」しコピー、上記コードにペーストしてください。
すると、下図のようになるはずです。

次に Google Apps Scriptのプロジェクトを保存してファイル名をつけてください。
ここでは getAttachedDocuments という名前にします。


次に必要な4つのパラメーターの設定を行います。



OUTPUT_FOLDER_ID


一括出力先フォルダ(例だと、Attached Documents)のフォルダID(下図の赤枠)を調べてコピーし、


それを、Google Apps Script の === FOLDER ID === と置き換えます。

実際のコードは下記の通り
  • var OUTPUT_FOLDER_ID = '=== FOLDER ID ==='; 

INPUT_SpreadSheet_ID


Googleフォームの回答先 GoogleスプレットシートのIDを調べて、コピーし、


それを、Google Apps Script の === Google SpreadSheet ID === と置き換えます。

実際のコードは下記の通り
    •   var INPUT_SpreadSheet_ID ='=== Google SpreadSheet ID ===';
      

    INPUT_SpreadSheet_num


    アップロードされたファイルのURLされている項目の項目番号を調べます。
    今回の場合、項目番号は 0から始まり、A列 = 0、B列 = 1、、、と続きます。

    今回の例は、入力項目は「名前」「ファイルアップロード」の2つです。
    Googleフォームが最初に入力された時刻を自動保存(タイムスタンプ)を保存するため、
    • A列(項目番号 0) = タイムスタンプ
    • B列(項目番号 1) = 名前
    • C列(項目番号 2) = ファイルアップロード(URL、複数の場合にはコンマ区切り)
    となっています。

    そのためファイルアップロードのための項目番号は 2となり
    • var INPUT_SpreadSheet_num = 2; // Item of Attached File Link (start is 0)
    のように値を 2 に置き換えます。

    OUTOUT_FOLDER_name_num


    最終的に下記のファイル名になりますが、このうち「名前」(登録者名)にあたる項目番号を調べます。
    • 年-月-日_登録者名_ファイル名 - 申請者名(Googleアカウントのプロフィール).ファイルの拡張子

    今回の項目番号は 1 となります。
    • A列(項目番号 0) = タイムスタンプ
    • B列(項目番号 1) = 名前
    • C列(項目番号 2) = ファイルアップロード(URL、複数の場合にはコンマ区切り)
    したがって、値を 1 に置き換えます。
    •   var OUTOUT_FOLDER_name_num = 1; // Item of Name (start is 0)

    そしてプロジェクトを保存します。

    STEP 4. 作成した Google Apps Scriptを実行してみる

    まずはいくつかテスト的にフォームに入力します。

    今回のテスト例は下記のようになります。
    申請者のGoogleアカウントプロフィール名(Kimiya Kitani)
    • 登録者名1:テスト2
      • 3ファイル:test1.xlsx, test2.xlsx, test3.xlsx
    • 登録者名2:ほげほげ
      • 1ファイル: test.xlsx

    Google Apps Scirpt(ここでは getAttachedDocumentsで保存)の▶(実行)ボタンをクリックします。
    • 最初の1度だけ後述する許可設定が必要です。
      *Goolge Workspace や G Suite for Education アカウントの場合には、この許可設定を聞いてこないことがあるかもしれません。
    うまくいけば、Attached Documents フォルダ内に、下記のように意図したファイル名になっていると思います。
    いろいろカスタムしたい場合には、
    をダウンロードして、適当に自由に改変してみればよいでしょう。

    許可設定


    1. 「許可を確認」ボタンをクリック

    2. Google Apps Scriptを作成した Googleアカウントを選択


    3. 「詳細」リンクをクリックし、getAttachedDocuments(安全ではないページ)に移動リンクをクリック



    4. getAttachedDocuments に対して必要な権限を許可します。



    2020年11月24日 @kimipooh