GASでフォーム回答データを印刷用シートへ取り込むコード|作業報告書システム準備編

Googleフォームの回答データを、印刷用シートへ取り込むGASコードです。
未取込分だけを追加するため、同じデータの重複取込を防げます。
コードが長いため、このページでは一部のみ表示しています。
全文コードは下のリンクからダウンロードしてください。

このコードでできること

・フォーム回答シートから未取込データだけ取得
・印刷用シートへ作業報告書データを追加
・報告番号をR0001形式で自動採番
・開始時間と終了時間から作業時間を計算
・印刷用シートA列にチェックボックスを設定
・フォーム回答シートに「取込済み」を記録

使用するシート

このコードでは、次の2つのシートを使用します。
・フォームの回答 1
・印刷用シート
シート名が違う場合は、コード内のシート名を変更してください。

GASコード

GASコード(一部抜粋)

function importFormResponsesToPrintSheet() {
  const formSheetName = 'フォームの回答 1';
  const printSheetName = '印刷用シート';
  const importStatusCol = 13;
  const importedText = '取込済み';
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const formSheet = ss.getSheetByName(formSheetName);
  const printSheet = ss.getSheetByName(printSheetName);
  if (!formSheet) {
    throw new Error('フォーム回答シートが見つかりません。');
  }
  if (!printSheet) {
    throw new Error('印刷用シートが見つかりません。');
  }
  const lastRow = formSheet.getLastRow();
  if (lastRow < 2) {
    Browser.msgBox('取込対象のデータがありません。');
    return;
  }
  const formData = formSheet.getRange(2, 1, lastRow - 1, 13).getValues();
  let reportNumber = getNextReportNumber(printSheet);
  const outputData = [];
  const importedRows = [];
  for (let i = 0; i < formData.length; i++) {
    const row = formData[i];
    const workDate = row[1];
    const workerName = row[2];
    const siteName = row[3];
    const importStatus = row[12];
    if (importStatus === importedText) {
      continue;
    }
    if (!workDate && !workerName && !siteName) {
      continue;
    }
    const reportId = 'R' + String(reportNumber).padStart(4, '0');
    const workTime = calculateWorkTime(row[5], row[6]);
    outputData.push([
      false,
      reportId,
      workDate,
      workerName,
      siteName,
      row[4],
      row[5],
      row[6],
      workTime,
      row[7],
      row[8],
      row[9],
      row[10],
      row[11]
    ]);
    importedRows.push(i + 2);
    reportNumber++;
  }
  if (outputData.length === 0) {
    Browser.msgBox('未取込データはありません。');
    return;
  }
  const startRow = printSheet.getLastRow() + 1;
  printSheet.getRange(startRow, 1, outputData.length, outputData[0].length).setValues(outputData);
  printSheet.getRange(startRow, 1, outputData.length, 1).insertCheckboxes();
  importedRows.forEach(function(rowNumber) {
    formSheet.getRange(rowNumber, importStatusCol).setValue(importedText);
  });
  Browser.msgBox(outputData.length + '件のデータを印刷用シートへ取り込みました。');
}

このページでは、メイン処理のみ掲載しています。
報告番号を取得する関数や、作業時間を計算する関数も必要です。
全文コードは、下のリンクからダウンロードしてください。

コードダウンロード

このコードは少し長いため、全文はダウンロード形式で配布しています。
コピペで使う場合は、こちらのコードを利用してください。

GASでフォーム回答データを印刷用シートへ取り込むコード 

カスタマイズ例

パターン①:シート名を変更する

使用しているシート名が違う場合は、次の部分を変更します。

const formSheetName = 'フォームの回答 1';
const printSheetName = '印刷用シート';

例:

const formSheetName = '作業報告書回答';
const printSheetName = '印刷データ';

パターン②:取込済みの文字を変更する

M列に入力する文字を変更できます。

const importedText = '取込済み';

例:

const importedText = '済';

よくあるエラー

フォーム回答シートが見つかりません

対処法
・シート名がコードと一致しているか確認
・全角、半角、スペースの違いを確認

未取込データはありません

対処法
・M列に「取込済み」が入っていないか確認
・フォーム回答シートに新しい回答があるか確認

初回実行時の注意点

初めて実行すると、Googleの承認画面が表示されます。
これはエラーではありません。
スプレッドシートを操作するために必要な確認です。
画面の案内に従って承認してください。

使う場面

このコードは、作業報告書システムの準備で使います。
Googleフォームに集まった回答を、印刷やPDF作成に使いやすい形へ整理します。
次の工程で、チェックした作業報告書だけを帳票化できます。

関連記事

【自動入力の準備】印刷用の作業報告書シートを作成する方法
Googleフォームの回答データを使って作業報告書へ内容を入力する方法
GASでチェックした作業報告書を帳票作成してPDF保存するコード
AIにフォーム回答データを印刷用シートへ取り込む機能を作らせてみた結果

詳しい使い方は、こちらの手順書記事で解説しています。

GASでGoogleフォームの回答データを印刷用シートへ取り込むコード

コメント