【GAS】Googleドライブに入れたファイルの情報をスプレッドシートに転記するスクリプト

最近Google Workspaceに関する情報を集めているのですが、とあるベンダーから届いたメールに電子帳簿保存法の対策をGoogle Workspaceを活用して行うという主旨のセミナーの案内が届きました。

電子帳簿保存法は、データで届いた請求書や契約書はデータで保管すべしという法律で、データの保管場所や方法を定めた上で検索できるようにファイルの命名規則や索引簿を作成する必要があります。

このセミナーの内容はどのようなものかはこれから受けるのでわかりませんが、GWSを使うというのを見て「あ~、その手があったか……!」と思った次第です。

データの保管はドライブでできますし、索引簿はスプレッドシートで可能です。そして作業をGASで効率化できてしまいます。

というわけで、電子帳簿保存法対策を想定して、ドライブに入れたファイルの情報を自動でスプレッドシートに転記するスクリプトを作成しました。

スクリプトの内容

まず索引簿となるスプレッドシートです。テーブルというシート名で設定します。

ID各レコードのID
登録日時この索引簿に登録された日時を記録
ファイルID処理したファイルのID。URLをリンクする
ファイル名処理したファイルの名前
取引年月日電帳法の要件。手動で入力
取引先電帳法の要件。手動で入力
取引金額電帳法の要件。手動で入力

電帳法では「取引年月日」「取引先」「取引金額」の3つを記録して検索できることが要件らしいので、とりあえずこれだけ列を用意。他に必要そうなものがあれば随時追加します。

検索はもちろん、フィルタ機能で絞り込みできるのでたぶん要件を満たしていると思います。ファイルへのアクセスもリンクから開けるので容易です。

作業手順としては、ドライブにある「未処理フォルダ」に書類データを入れます。

スクリプトの実行方法にもよりますが、時間でトリガー設定しておくのであればこれだけでOK。

テーブルシートにファイルの情報が記録されます。

取引年月日などはOCRのライブラリを使えば取れそうではありますが、書類によってフォーマットは異なりますし正確ではなさそうなので、ここはまぁ手入力で。

入力規則を設定しておけば取引年月日はカレンダーから選択する方式にできたり、マスタを作っておけば取引先も選択すればOKになりますので、入力をより簡易にすることも可能です。

処理を行ったあとのデータは「未処理フォルダ」から「保管フォルダ」へ移動されます。つまり二重で処理することはありません。

GAS

function RecordFileInfo() {
  const START_TIME = new Date(); // 実行時刻 (タイムアウト判定用)
  const RECORD_DATE = Utilities.formatDate(START_TIME, "Asia/Tokyo", "yyyy-MM-dd hh:mm:ss"); // 入力用時刻
  const UNPROCESSED_FOLDER = DriveApp.getFolderById('未処理フォルダのID');
  const STRAGE_FOLDER = DriveApp.getFolderById('保管フォルダのID');
  const THIS_SPREADSHEET = SpreadsheetApp.openById('このスプレッドシートのID');
  const TABLE_SHEET = THIS_SPREADSHEET.getSheetByName('テーブル'); // シート名
  
  // フィルタを解除
  if(TABLE_SHEET.getFilter()!==null){
    TABLE_SHEET.getFilter().remove();
  }

  // 未処理フォルダ内のファイルを取得して1つずつ処理
  let files = UNPROCESSED_FOLDER.getFiles();
  while(files.hasNext()){
    let file = files.next();
    let file_name = file.getName(); // ファイル名
    let file_id = file.getId();     // ファイルID
    let file_url = file.getUrl();   // ファイルURL
    file.moveTo(STRAGE_FOLDER);     // 保管フォルダへ移動

    // テーブルシートに入力
    let target_row = TABLE_SHEET.getLastRow() + 1;
    let record_id = target_row - 1; // IDは最終行-1
    TABLE_SHEET.getRange(target_row, 1).setValue(record_id);
    TABLE_SHEET.getRange(target_row, 2).setValue(RECORD_DATE);
    TABLE_SHEET.getRange(target_row, 3).setValue('=HYPERLINK("' + file_url + '","' + file_id + '")'); // 表示する値はファイルIDで、ファイルURLをリンク
    TABLE_SHEET.getRange(target_row, 4).setValue(file_name);

    // 実行時間が5分を過ぎていれば中止
    if (isTimeout(START_TIME)) {
      return;
    }
  }
}

function isTimeout(START_TIME) {
  let diff = parseInt((new Date() - START_TIME) / (1000 * 60));
  if (diff >= 5) {
    return true;
  }
  return false;
}

データの真実性については要検討

あとはデータの真実性が担保されるよう、変更や改ざんが行われないようにする必要があります。

保管フォルダ内のデータについては権限設定で変更できないようにするなどといった対応になりますかね。

その辺はセミナーを受けて勉強してこようと思います。

追記: データの真実性はVaultを使用するため、Business Standard以上が必要

セミナーを受けまして、データの真実性については「Vault」を使用してデータの編集履歴を残すことで対応するようです。

Google Vault: 電子情報開示とメール アーカイブ | Google Workspace
Google Vault を使用すると、会社のメール、オフレコが解除されているチャット、Google ドライブ ファイルのコンテンツの管理、保持、検索、書き出しが可能です。Google Workspace で Vault をご利用ください。

このVaultを使用するには、Google WorkspaceのBusiness Standard以上のプランが必要です。

ただ、電帳法対策のサービスを契約するよりも、GWSのBusiness Standardを契約した方がコスパは良いのではないかと思います。

コメント

コメントする前にお読みください

プログラミングに関する質問について、詳細なコードはお答えしませんのでご了承ください。
また、迷惑コメント防止のために初回のコメント投稿は承認制です。投稿が反映されるまで少し時間がかかります。