Googleスプレッドシートで差し込み印刷

「差し込み印刷」といえば、Word文書にExcelのデータ(表)を差し込む・・・というのが定番ですが、Wordで帳票レイアウトを綺麗に組むのって、なかなか難しいですよね。

そんな時、帳票レイアウトもExcelやスプレッドシートで作れたら便利です。

この記事では、Googleスプレッドシートで作成した帳票の雛形に、スプレッドシートの表データを差し込む方法を説明します。

* この記事で紹介した方法を使用したことにより、ご利用者様または第三者に損害・トラブル等が発生した場合でも、当サイト運営者は一切の責任を負いません。出力結果を十分ご確認いただき、自己責任でご利用をお願いいたします。

当ブログには、他にも差し込み印刷の解説記事があります。よければあわせてご覧ください。

スプレッドシート帳票への差込方法

帳票の雛形をつくる

まずは、Googleスプレッドシートで帳票の雛形を作成します。

データを差し込みたい部分には、二重波括弧{{ }}で囲んだ項目名を入力します。
* 社員番号を差し込む場合の入力例:{{ 社員番号 }}

雛形とする帳票のサンプル(スプレッドシート)。データを差し込みしたい箇所には、{{ 社員番号 }} のように、二重波括弧で囲んだ項目名を入力しておく。

差し込むデータを用意

次に、Googleスプレッドシートで表形式の差し込みデータを用意します。

1行目は必ずヘッダー行(項目名を入力する行)としてください。
帳票にデータを差し込むには、項目名を帳票に入力したものと一致させる必要があります。(二重波括弧{{ }}は不要です。)

1行目が項目名となっている、一般的な形式の表を用意する。項目名に二重波括弧はつけない。

ツールに情報を入力して処理を実行

下記のリンク先からコピーを作成を押して、ツールをコピーしてください。(マイドライブにコピーされます)

スプレッドシート 差込データ作成ツール

ツールを開き、①帳票テンプレートのURL・シート名を入力、②差込データのURL・シート名を入力、③差し込み実行ボタンを押してください。

帳票および差込データのURL・シート名を入力し、差し込み実行ボタンを押す。

なお、初めて差し込み実行を行う際は、承認作業が必要になります。下記を参考に承認作業を進めてください。

「承認が必要です」というダイアログが表示されますので、権限を確認 をクリックします。
* この部分の解説画像は、他の記事から流用しているため、実際のものと若干異なる場合があります。

このスクリプトを使うGoogleアカウントを選択します。

(この画面が表示された場合のみ)左下の 詳細 をクリックします。

(この画面が表示された場合のみ)左下の プロジェクト名(安全ではないページ)に移動 をクリックします。

右下の 許可 をクリックします。

処理が完了すると、下図のようなダイアログが表示されますので、記載されているファイルを開いてください。

下図のように、差込が反映されたスプレッドシートが作成されています。
今回の例では、差込データが12行だったので、12個のシートが作成されています。

出力されたファイル。差し込みデータの行数分のシートが作成されている。

印刷・PDF出力

このツールが対応しているのは、先述した差込後ファイル(スプレッドシート)を作成するところまでです。

PDF出力や紙へのプリントアウトは、Googleスプレッドシートの標準機能で行なってください。

PDF出力する場合
ファイル > ダウンロード > PDF(.pdf) > お好みの設定*をしてエクスポート

印刷する場合
ファイル > 印刷 > お好みの設定*をして次へ > プリンタの選択等をして印刷

* 設定項目の「エクスポート」は「ワークブック」を選択する

参考:ソースコード

参考までに、ソースコードを掲載します。

差し込み(≒置換)を行うにあたって、スプレッドシートの検索と置換に相当する、TextFinderを利用して、replaceAllWithメソッドで一括置換してみました。

function createMergedSpreadsheet(){
  // ダイアログで実行確認
  const ui = SpreadsheetApp.getUi();
  const response = ui.alert("差込データ作成を実行しますか?", ui.ButtonSet.OK_CANCEL);
  if (response !== ui.Button.OK) return;

  // ツールシートの入力値および参照するシートを取得
  const toolSheet = SpreadsheetApp.getActiveSheet();
  const modelSheetUrl = toolSheet.getRange("C3").getValue();
  const modelSheetName = toolSheet.getRange("C4").getValue();
  const modelSheet = SpreadsheetApp.openByUrl(modelSheetUrl).getSheetByName(modelSheetName);
  const dataSheetUrl = toolSheet.getRange("C7").getValue();
  const dataSheetName = toolSheet.getRange("C8").getValue();
  const dataSheet = SpreadsheetApp.openByUrl(dataSheetUrl).getSheetByName(dataSheetName);

  // 差込データシートから差込前後情報をもつオブジェクトを作成する
  const table = dataSheet.getDataRange().getDisplayValues();
  const keys = table[0];
  const rows = table.slice(1);
  const replaceLists = rows.map(row => {
    const replaceList = row.map((cell, index) => {
      return { before: keys[index], after: cell };
    });
    return replaceList;
  });

  // 出力シートを作成する
  const now = Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd HH:mm:ss");
  const outputSS = SpreadsheetApp.create(`${modelSheetName}(差込:${now})`);

  // 差し込みリストの行数分、差し込みを行い出力シートを作る
  replaceLists.forEach((replaceList, index) => {
    // 出力シートの作成(テンプレートをコピー)
    const outputSheet = modelSheet.copyTo(outputSS).setName(`${index + 1}`);
    // 差し込みを反映
    replaceList.forEach((item) => {
      outputSheet
        .createTextFinder(`\\{\\{ *${item.before} *\\}\\}`)   // {{ 項目名 }} で検索
        .matchCase(true)                                      // 大文字小文字を区別
        .useRegularExpression(true)                           // 正規表現を使用
        .replaceAllWith(`${item.after}`);                     // 該当する全セルを置換
    });
  });

  // 先頭に作成されている「シート1」を削除
  outputSS.deleteSheet(outputSS.getSheets()[0]);

  // 終了メッセージ
  SpreadsheetApp.getUi().alert(
      "差込データ作成が完了しました。" + "\n"
    + "\n"
    + "出力先:" + "\n"
    + `マイドライブ > ${outputSS.getName()}` + "\n"
    + "\n"
    + "URL:" + "\n"
    + outputSS.getUrl()
  );
}

コメント