記事内に広告が含まれています

【Excel業務をDX化】Excelの経費申請書をGoogleフォームで自動生成してみた話

テクノロジー
この記事は約6分で読めます。

こんにちは、なりかくんです。
今年もこの時期がやってきました。「Qiita Advent Calendar 2025」です!

今回この記事は、「Excel業務をDX化したい。あなたならどうする? by MESCIUS Advent Calendar 2025」の6日目の記事となります!

Excel業務をDX化したい。あなたならどうする? by MESCIUS - Qiita Advent Calendar 2025 - Qiita
Calendar page for Qiita Advent Calendar 2025 regarding Excel業務をDX化したい。あなたならどうする? by MESCIUS.

「Excel業務をDX化しよう」という記事で、なにを書こうか悩んだ結果、過去に作った「Excelで作られている経費申請書をGoogleフォームから作れるようにする」というプログラムを紹介していこうと思います。(経緯などは記事の中で紹介します。)

スポンサーリンク

Excelで作られている経費申請書

まず、Excelで作られている経費申請書はこのような形になります。
※ もちろん本物は持ってこれないので、それっぽく作りました。

当時、私の周りにはパソコンが苦手な方が複数名いました。その中には「WordやExcelのテンプレートが用意されていても難しい」という人が居ました。

また、テンプレートを作っていても、「いろいろ触っていたらデザインが人によって大幅に違う。」なんてこともありました。

そこで、「アンケート形式で経費申請書を作れたら、いいのでは?」と考えた私は、GoogleフォームとGASを使って、経費申請書を作れるようにプログラムを作りました。
(後Googleフォームなので、スマホから作れるっていう利点もでかい)

Googleフォーム × GASで作る経費申請書

GASを使って、経費申請書を作るためには、まず既存のExcel経費申請書テンプレートをGoogleスプレッドシートデータに変換する必要があります。

と言っても、Googleスプレッドシート上でExcelデータを開いて、変換をクリックすれば一瞬で変換できます。

なんて便利なんでしょうか。

Googleフォームを作る

申請用のGoogleフォームを作ります。内容は、シート内にあるのを全て書き込んでいるだけです。

こちらがGASのコードになります。(シート上では、14行ぐらい明細行がありますが、めんどくさかったので、今回4つ迄しか作っていないです。)

function onFormSubmit(e) {
  const templateId = "";
  const folderId   = "";

  const templateFile = DriveApp.getFileById(templateId);

  const folder = DriveApp.getFolderById(folderId);
  let copiedFile = templateFile.makeCopy("立替経費_" + new Date().toISOString(), folder);
  const copiedId = copiedFile.getId();
  const ss = SpreadsheetApp.openById(copiedId);
  const sheet = ss.getSheetByName("Sheet1");
  const responses = e.response.getItemResponses();

  const v = {};

  responses.forEach(r => {
    v[r.getItem().getTitle()] = r.getResponse();
  });
  sheet.getRange("L4").setValue(v["No"]);
  sheet.getRange("L5").setValue(v["申請日"]);
  sheet.getRange("D4").setValue(v["社員番号"]);
  sheet.getRange("D5").setValue(v["氏名"]);
  sheet.getRange("D6").setValue(v["所属"]);

  const maxItems = 4;
  const rows = [13, 14, 15, 16];

  for (let i = 1; i <= maxItems; i++) {
    const row = rows[i - 1];

    const dateKey    = `日付【${i}件目】`;
    const contentKey = `支払内容【${i}件目】`;
    const purposeKey = `利用目的【${i}件目】`;
    const toKey      = `支払先【${i}件目】`;
    const priceKey   = `金額【${i}件目】`;

    if (v[dateKey])    sheet.getRange(`C${row}`).setValue(v[dateKey]);
    if (v[contentKey]) sheet.getRange(`D${row}`).setValue(v[contentKey]);
    if (v[purposeKey]) sheet.getRange(`F${row}`).setValue(v[purposeKey]);
    if (v[toKey])      sheet.getRange(`I${row}`).setValue(v[toKey]);
    if (v[priceKey])   sheet.getRange(`L${row}`).setValue(v[priceKey]);
  }

  if (v["備考"]) {
    sheet.getRange("C30").setValue(v["備考"]);
  }

  Logger.log("作成完了");
}

流れとしてはこのような形です。

Googleフォーム回答

GASトリガー起動(onFormSubmit)

テンプレートファイルをコピー

スプレッドシートに転記

実際にフォームを送ると、このように自動で入力されたスプレッドシートが作成されます。

その後の処理も自動化できる

GASは可能性が無限大なので、今回はめんどくさかったのでGoogleスプレッドシートに自動入力するだけでしたが、私が過去に作った際にはメールアドレスを入力させて、フォームを送信したら、PDFに変換してメールにてGoogleスプレッドシートの共有リンクとPDFを送信するという形にしていました。

また、GAS上でもGoogleスプレッドシートからExcel形式にエクスポートも出来るのでExcelしか使えないお堅い上司でも問題なく、いろいろ工夫すれば自動化できるのではないでしょうか。

今回作ったシステムは私的にはすごく必要の無いものだとは思いますが。(知ってた)

最後までお読みいただきありがとうございました。なりかくんでした!

コメント

タイトルとURLをコピーしました