Googleフォームの回答を、フォーマット化しているシートにダイレクトに差し込み(転記)して、そのシートをPDF化したり印刷したりしてそのまま使用したい、というご要望が割とあります。

要は、スプレッドシートの中に「回答一覧」シートと「フォーマット」シートが用意されているとして、回答一覧に送信されてきた最新の回答の値を、「フォーマット」シートのコピーシートに差し込むというものです。

今回は、そのような処理を実行する過去何度か構築したGAS(Google Apps Script)を汎用的にしたものを公開いたします。

私が作成したサンプルコードの主な仕様は以下の通りです。

<サンプルコードの仕様>

・Googleフォームとリンクするスプレッドシート内に予め「フォーマット」シートを用意しておく
・回答シートの3列目が送信者の氏名と仮定
・自動作成されるフォーマットのコピーシートの名前は [{回答送信日}_{氏名}様] でセットされる
・mapping配列内で回答シートの列と転記先のセルをマッピングする

サンプルコードをカスタマイズすればかなり便利にご利用いただけるかと思いますので、ぜひ、ご自由にお使いください!

※ご質問にはお答えできませんので予めご承知おきくださいませ。

スプレッドシートのシート一覧イメージ

スプレッドシートのシート一覧画像

コード

function formAnswerCopyToFormat() {
  const answerSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("回答シートの名前");
  const formatSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("フォーマット");

  const answerSheetLastRow = answerSheet.getLastRow();
  const answerRowValues = answerSheet.getRange(answerSheetLastRow, 1, 1, answerSheet.getLastColumn()).getValues()[0];

  // フォーマットシートをコピー
  let targetFileSheet = formatSheet.copyTo(SpreadsheetApp.getActiveSpreadsheet());

  // コピーしたフォーマットシートの名前をセット
  const targetSheetName = Utilities.formatDate(answerRowValues[0], "JST", "yyyy-MM-dd_") + answerRowValues[2] + "様";
  targetFileSheet.setName(targetSheetName);

  // 回答シートの列:フォーマットシート内の転記先 でマッピング
  const mapping = {
    A: "C4",
    C: "C8",
    E: "C7",
    F: "D8",
    G: "F8",
    H: "G8",
    I: "B9",
    J: "D9",
    K: "C10",
    L: "C14",
  };

  for (const key in mapping) {
    const value = answerRowValues[columnToIndex(key)];
    const targetCell = mapping[key];
    targetFileSheet.getRange(targetCell).setValue(value);
  }
}

// セル位置計算用
function columnToIndex(column) {
  let index = 0;
  for (let i = 0; i < column.length; i++) {
    index *= 26;
    index += column.charCodeAt(i) - 64;
  }
  return index - 1;
}

トリガー設定

対象関数:formAnswerCopyToFormat

「スプレッドシートから」かつ「フォーム送信時」で設定してください。