Google Forms + Google Apps Scriptで書類提出を効率化する

公開日:2018-11-01
最終更新:2018-11-01

友達に作って欲しいって言われたから作った

  • GoogleFormに項目を並べる
  • 結果は並び替えたい
  • アップロードされたファイルたちはまとめたい
/**
  * フォームの送信イベントのフック処理
  * 
  * @param {Array} event 
  */
function onSubmit(event) {
  // 各種設定
  // NOTE: ここの順番を変えれば集計シートの並び替えができる
  const SORTED_LABELS = [
    "項目1",
    "タイムスタンプ",
    "項目2",
  ];

  const SPREADSHEET_ID = "";    // 記録を書き込むスプレッドシートのID
  const SHEET_NAME = "アップロード集計";    // 並び替え後の項目が記載されているシート名

  const UPLOAD_FILES_LABEL = "提出書類";    // GoogleFormの項目名
  const ROOT_FOLDER_ID = "";   // まとめたいフォルダのID
  const EMPTY_UPLOAD_FILE_MESSAGE = "なし";   // 提出書類がない時の表示

  // ここから書き込み処理
  {
    Logger.log("on received form event. %s", event);

    // 該当のSpreadsheetを取得
    // ない時はエラーになるので存在するシートを指定してね
    const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);

    if (!spreadsheet) {
      throw new Error("Invalid Spreadsheet ID " + SPREADSHEET_ID);
    }

    // 指定された名前のワークシートを取得する
    // なければ作る、その時項目名を一番上に記述しておく
    var sheet = spreadsheet.getSheetByName(SHEET_NAME);

    if (!sheet) {
      Logger.log("create worksheet %s", SHEET_NAME);

      sheet = spreadsheet.insertSheet(SHEET_NAME);
      sheet.getRange(1, 1, 1, SORTED_LABELS.length).setValues([SORTED_LABELS]);
      sheet.getRange(1, SORTED_LABELS.length + 1).setValue(UPLOAD_FILES_LABEL);
    }

    // 指定された並び替え順に値を配列に詰めていく
    // 詰め終わったら最後の行に書き込む
    const values = [];
    SORTED_LABELS.forEach(function (label) {
      values.push(event.namedValues[label][0]);
    });

    // 提出書類をひとつのフォルダにまとめる
    // まとめたフォルダのURLを追記しておく
    const urlsString = String(event.namedValues[UPLOAD_FILES_LABEL]);
    const folderId = createUploadFilesFolder(urlsString.split(', '), ROOT_FOLDER_ID);
    values.push(folderId || EMPTY_UPLOAD_FILE_MESSAGE);

    sheet.getRange(sheet.getLastRow() + 1, 1, 1, values.length).setValues([values]);
  }
}

/**
 * 提出書類をまとめるフォルダを作成する
 * 
 * 下記のようなフォルダ構成にする
 * RootFolder/yyyy年/MM月/dd日/yyyy年MM月dd日HH時mm分ss秒_<RandomValue>
 * 
 * ミリ秒まで入れる or ランダム で衝突率の低いランダムを選択
 * 
 * @param {Array} fileUrls 
 * @param {String} rootFolderId 
 */
function createUploadFilesFolder(fileUrls, rootFolderId) {
  if (!fileUrls || fileUrls.length == 0) {
    return null;
  }

  const now = new Date();

  const rootFolder = DriveApp.getFolderById(rootFolderId);

  const yearFolder = getOrCreateChildFolder(rootFolder, Utilities.formatDate(now, "JST", "yyyy年"));
  const monthFolder = getOrCreateChildFolder(yearFolder, Utilities.formatDate(now, "JST", "MM月"));
  const dayFolder = getOrCreateChildFolder(monthFolder, Utilities.formatDate(now, "JST", "dd日"));

  const randomValue = Math.random().toString(36).slice(-8);
  const foldername = Utilities.formatDate(now, "JST", "yyyy年MM月dd日HH時mm分ss秒") + "_" + randomValue;
  const folder = dayFolder.createFolder(foldername);

  fileUrls.forEach(function (fileUrl) {
    const fileId = fileUrl.replace("https://drive.google.com/open?id=", "");
    const file = DriveApp.getFileById(fileId);
    file.makeCopy(folder);
    // NOTE: もし元のファイルがいらないのであれば下記コメントを解除して削除するといいかもね
    // DriveApp.removeFile(file);
  });

  return folder.getUrl();
}

/**
 * 対象のFolder以下から指定の名前のフォルダを取得する
 * なければ指定の名前でフォルダを作成して返す
 * 
 * @param {Folder} folder 
 * @param {String} name 
 */
function getOrCreateChildFolder(folder, name) {
  const folderIterator = folder.getFoldersByName(name);
  if (folderIterator.hasNext()) {
    return folderIterator.next();
  }
  return folder.createFolder(name);
}
記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@M2Q8VjrEAcXv1ige'の技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする