スプレッドシートの集計表をGoogleドキュメントへ毎回貼り付けているなら、必要な範囲を2次元の文字列配列として読み、文書の表へ追加できます。表示されている「1,200円」などの文字をそのまま見せる用途では、元の数値より表示文字を使う方法が合います。
ただし、シートの数式や表示形式まで文書へ引き継ぐ処理ではありません。文書へ入るのは文字列なので、数字を再計算する表とは役割を分けます。まず小さな練習表を、コピーした文書へ1つ追加する例で確認します。
表示文字を使う範囲を決める
練習用シート「表練習」のA1:B3へ、見出し「商品」「数量」と、「ペン・2」「ノート・3」の架空データを入れます。getDisplayValuesで読むと、表示された値がすべて文字列になります。
数量の2と、表示文字の「2」は型が違います。今回の目的は帳票へ文字を並べることなので、表示を優先します。集計や数値検査をする段階では、元の値を読む処理と分けてください。スプレッドシートの読み書きで取得方法の違いを確認できます。
文書側は1タブで、表がまだない練習用コピーを用意します。元テンプレートを残し、コピーのIDをコードへ指定します。追加する前の本文を確認してから実行してください。
3行2列の表を追加するコード
公式のBody.appendTableは、文字列の2次元配列から表を作ります。以下は行数・列数と型を調べ、既存の表があれば重ねて追加せずに止める例です。
function appendPracticeTable(book, doc, apply) {
const sheet = book.getSheetByName('表練習');
if (!sheet) throw new Error('表練習シートがありません');
const cells = sheet.getRange('A1:B3').getDisplayValues();
if (cells.length !== 3 || cells.some(row => row.length !== 2 ||
row.some(value => typeof value !== 'string'))) {
throw new Error('3行2列の表示文字を確認してください');
}
const tabs = doc.getTabs();
if (tabs.length !== 1 || tabs[0].getChildTabs().length !== 0) {
throw new Error('1タブの練習用文書を指定してください');
}
const body = tabs[0].asDocumentTab().getBody();
if (body.getTables().length > 0) throw new Error('既に表があります');
if (apply === true) {
body.appendTable(cells);
doc.saveAndClose();
}
return {rows: cells.length, columns: cells[0].length, wrote: apply === true};
}
function previewTableAppend() {
const APPLY = false;
const book = SpreadsheetApp.getActiveSpreadsheet();
const doc = DocumentApp.openById('コピーした練習用文書ID');
console.log(JSON.stringify(appendPracticeTable(book, doc, APPLY)));
}
APPLY:falseなら追加しません。ログがrows:3,columns:2,wrote:falseになることを確認します。練習用文書へ追加を試すときだけtrueへ変え、見出しを含む3行と、2列の対応が画面でも合っているかを見ます。
空欄と数式エラーも表示として入る
表示文字を使うので、空欄は空の文字列です。見出しが空だったり、数式のエラーが表示されていたりしても、文字列という型だけでは不備を見つけられません。必要な見出しと値を確かめる段階を追加します。
セルの背景色、罫線、列幅、リンク先を同じ見た目で移す例でもありません。これらが必要なら、文書側の表の書式を別に設定します。最初からすべての書式をコピーしようとせず、読み手に必要な情報がそろったかを先に確認します。
公式資料では表の後ろに空の段落も追加されると説明されています。文書は表だけで終われないためです。追加後に末尾へ空段落があることだけで、失敗したと判断しないようにします。
完成した帳票を確認する
表を追加した後に再び実行すると、既存表の確認で止まります。この例は既存表の更新や差し替えをしません。対象期間が変わった帳票を作るなら、新しいコピーへ出すのか、既存表を更新するのかを別に決めます。
ローカルでは代用シートとBodyで、表示文字の受け渡し、preview、表の追加と保存、既存表と不正な配列の拒否を確認しました。Google Docs上の列幅や改ページは未実行です。文書からPDFを出す場合も、追加に成功したことと、配布できる表示になったことは分けて確認します。
帳票の保存や配布を考えるときは、PDF出力の基本と合わせて、表を作る・表示を見る・出力する順で試してください。
