はじめに
「毎月、請求書とか案内状とか、同じような内容の書類を何十通も作るの大変ですよね」
そんなあなたに朗報!
Google Apps Script (GAS) を使えば、スプレッドシートのデータからGoogleドキュメントに自動で差し込み印刷できるってご存じですか?
今回は、そんな魔法みたいなスクリプトの作り方を、ステップバイステップで徹底解説します!
コピペOKのコードも用意しましたので、プログラミング初心者でもご安心ください!
🚀 準備するもの
- Googleアカウント
- 差し込み印刷したいデータの入ったスプレッドシート
- 差し込み印刷のテンプレートとなるGoogleドキュメント
📝 ステップ1: スプレッドシートの準備
まずは、差し込み印刷の元データとなるスプレッドシートを準備しましょう!- Googleスプレッドシートを新規作成。
- 1行目に、差し込みたい項目の見出しを入力(例: 氏名、会社名、住所など)。
- 2行目以降に、実際のデータを入力。
こんな感じのイメージです↓
氏名 |
敬称 |
会社名 |
役職 |
郵便番号 |
住所 |
山田太郎 |
様 |
株式会社ABC |
営業部長 |
100-0001 |
東京都千代田区… |
田中花子 |
様 |
XYZ株式会社 |
企画課長 |
530-0001 |
大阪府大阪市… |
佐藤次郎 |
殿 |
有限会社DEF |
経理担当 |
812-0011 |
福岡県福岡市… |
ポイント:
- シートの名前は「データ」にしておくと、後でコードをコピペしやすいです!
- 見出し(1行目)は、後でテンプレートのプレースホルダーと対応させるので、わかりやすい名前をつけてください!
🎨 ステップ2: テンプレートドキュメントの作成
次に、差し込み印刷のひな形となるGoogleドキュメントを作成します!
- Googleドキュメントを新規作成。
- 差し込みたい場所に、 の形式で、スプレッドシートの見出しに対応する文字列を入力。
例えば、こんな感じ↓
〒
いつもお世話になっております。
... (本文) ...
ポイント:
- の中身は、スプレッドシートの1行目の見出しと完全に一致させてください!
(大文字・小文字、スペースなども!) - フォントや文字サイズ、色などの書式は、ここで設定したものが反映されます!
💻 ステップ3: GASスクリプトの作成と設定
いよいよ、魔法の呪文(スクリプト)を書いていきます!
スプレッドシートのメニューから「拡張機能」>「App Script」を選択。
表示されたエディタに、以下のコードをコピペします!
JavaScript
/**
* 設定情報を取得する関数
* @return {Object} 設定オブジェクト
*/
function getConfig() {
return {
spreadsheetId: 'あなたのスプレッドシートID', // スプレッドシートのID
templateDocId: 'あなたのテンプレートドキュメントID', // テンプレートドキュメントのID
outputFolderId: '', // 出力先フォルダのID (マイドライブのルートの場合は空文字)
dataSheetName: 'データ', // データが格納されているシートの名前
pdfOutputFolderId: '', // PDFの出力先フォルダID (指定がない場合はDocsと同じ場所)
};
}
/**
* メインの差し込み印刷処理関数(ドキュメント生成)
*/
function createDocuments() {
// 設定情報を取得
const config = getConfig();
// スプレッドシートとテンプレートドキュメントを取得
const spreadsheet = SpreadsheetApp.openById(config.spreadsheetId);
const templateDoc = DocumentApp.openById(config.templateDocId);
// データシートを取得
const dataSheet = spreadsheet.getSheetByName(config.dataSheetName);
// データ範囲を取得 (ヘッダー行を除く)
const dataRange = dataSheet.getDataRange();
const values = dataRange.getValues();
const headers = values[0]; // ヘッダー行
// 出力先フォルダを取得
const outputFolder = config.outputFolderId
? DriveApp.getFolderById(config.outputFolderId)
: DriveApp.getRootFolder();
// データ行ごとに処理
for (let i = 1; i < values.length; i++) { // ヘッダー行を除いてループ
const rowData = values[i];
// 新しいドキュメントを作成(ファイル名を先に生成)
const newDocName = `${rowData[0]}様_${new Date().toLocaleDateString()}`;
const newDoc = DocumentApp.create(newDocName);
const newDocBody = newDoc.getBody();
// テンプレートドキュメントの内容を新しいドキュメントに要素ごとにコピー
const templateElements = templateDoc.getBody().getParagraphs();
for (let k = 0; k < templateElements.length; k++) {
const elementType = templateElements[k].getType();
if (elementType == DocumentApp.ElementType.PARAGRAPH) {
//テキストと書式をコピー
newDocBody.appendParagraph(templateElements[k].copy());
} else if (elementType == DocumentApp.ElementType.TABLE) {
//表をコピー(必要に応じて)
newDocBody.appendTable(templateElements[k].copy());
} else {
// 他の要素タイプへの対応が必要な場合はここに追加
}
}
// ヘッダーと各行のデータを対応付けてプレースホルダーを置換
for (let j = 0; j < headers.length; j++) {
const placeholder = `}`;
const value = rowData[j] || ''; // データがない場合は空文字にする
// 段落ごとにプレースホルダーを置換
let paragraphs = newDocBody.getParagraphs();
for (let p = 0; p < paragraphs.length; p++) {
paragraphs[p].replaceText(placeholder, value);
}
}
newDoc.saveAndClose();
// 指定したフォルダに移動
DriveApp.getFileById(newDoc.getId()).moveTo(outputFolder);
}
// 処理完了メッセージ
Browser.msgBox("差し込み印刷(ドキュメント生成)が完了しました.");
}
/**
* 生成されたドキュメントをPDFに変換する関数
*/
function convertToPdf() {
const config = getConfig();
// ドキュメントの出力先フォルダを取得(PDFの出力先とは異なる可能性がある)
const docOutputFolder = config.outputFolderId
? DriveApp.getFolderById(config.outputFolderId)
: DriveApp.getRootFolder();
// PDFの出力先フォルダを取得。指定がなければドキュメントと同じ場所
const pdfOutputFolder = config.pdfOutputFolderId
? DriveApp.getFolderById(config.pdfOutputFolderId)
: docOutputFolder;
// ドキュメントの出力先フォルダ内のファイルを取得
const files = docOutputFolder.getFilesByType(MimeType.GOOGLE_DOCS);
// 各ファイルをPDFに変換
while (files.hasNext()) {
const docFile = files.next();
const docId = docFile.getId();
// PDFに変換
const pdfBlob = docFile.getAs(MimeType.PDF);
// PDFファイルを作成 (ファイル名は元のドキュメント名 + ".pdf")
pdfOutputFolder.createFile(pdfBlob).setName(docFile.getName() + ".pdf");
// 元のドキュメントファイルを削除する場合(オプション)
//DriveApp.getFileById(docId).setTrashed(true);
}
Browser.msgBox("PDFへの変換が完了しました.");
}
/**
* スプレッドシートが開かれたときにカスタムメニューを追加する関数
*/
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('差し込み印刷')
.addItem('ドキュメント生成', 'createDocuments')
.addItem('PDF出力', 'convertToPdf') // PDF出力メニューを追加
.addToUi();
}
- getConfig 関数の中にある 'あなたのスプレッドシートID' と 'あなたのテンプレートドキュメントID' を、
自分のスプレッドシートとテンプレートドキュメントのIDに書き換えてください!
(IDは、スプレッドシートやドキュメントのURLの、/d/ と /edit の間の部分となります) - 必要に応じて、outputFolderId (ドキュメントの出力先) と
pdfOutputFolderId (PDFの出力先) も書き換えてださい。 - 指定しない場合は、マイドライブのルートフォルダになります。
- スクリプトエディタのメニューバーにある「保存」アイコンをクリック
✨ ステップ4: カスタムメニューの追加(おまけ)
スプレッドシートのメニューから、スクリプトを直接実行できるようにしましょう!
上記のコードには、onOpen関数が既に含まれているので、
スプレッドシートを再読み込みするだけでOKです!
「差し込み印刷」という項目がメニューに追加されています。
🏃♀️ ステップ5: 実行!
準備は整いました!さっそく差し込み印刷を実行してみましょう!
- スプレッドシートのメニューから「差し込み印刷」>「ドキュメント生成」を選択。
- 初回実行時は、スクリプトがスプレッドシートやドキュメントにアクセスするための許可を求められるので、画面の指示に従って許可してださい
- しばらく待つと…指定したフォルダに、差し込み印刷されたドキュメントが生成されます!
- ドキュメントをPDFで出力する場合は、「差し込み印刷」>「PDF出力」を選択
🤖 コードの解説
「コピペしたけど、中で何やってるかよくわからない…」って人のために、コードの解説も載せてみます!
-
getConfig 関数
JavaScriptfunction getConfig() {
return {
spreadsheetId: 'あなたのスプレッドシートID',
templateDocId: 'あなたのテンプレートドキュメントID',
outputFolderId: '',
dataSheetName: 'データ',
pdfOutputFolderId: '',
};
spreadsheetId、templateDocId、outputFolderId、dataSheetName、pdfOutputFolderId を
自分の環境に合わせて書き換える必要があります
-
createDocuments 関数
function createDocuments() {
// ... (省略) ...
}
これが差し込み印刷のメイン処理を行う関数です
- スプレッドシートからデータを読みこみます
- テンプレートドキュメントをコピーして、プレースホルダーを置換。
- 新しいドキュメントを生成しています。
- スプレッドシートとテンプレート、データ範囲を取得します。
- データ行ごとにループ開始
- ドキュメント名を決めます。
- テンプレートをコピーします。
- プレースホルダーを置換します
- 名前を付けて保存、指定フォルダに移動します
- ループ終了します
-
convertToPdf 関数
JavaScriptfunction convertToPdf() {
// ... (省略) ...
}
- ドキュメントの出力先フォルダにあるGoogleドキュメント形式のファイルを取得
- 各ファイルについてループ開始
- PDFに変換
- 名前を付けて保存
- ループ終了
-
onOpen 関数
JavaScriptfunction onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('差し込み印刷')
.addItem('ドキュメント生成', 'createDocuments')
.addItem('PDF出力', 'convertToPdf')
.addToUi();
} - スプレッドシートを開いたときに、自動的にカスタムメニューを追加するための関数となります。
createMenu でメニューを作成し、addItem でメニュー項目と実行する関数を紐付けています。
🌈 まとめ
今回は、GASを使ってスプレッドシートからGoogleドキュメントに差し込み印刷する方法を紹介しました!
最初は少し難しく感じますが、慣れると非常に便利ですので、ぜひチャレンジしてください!
「ここがわからない!」「もっとこんな機能が欲しい!」などあれば、コメントでお教え頂けますと嬉しいです!
- カテゴリ:
- Google Workspace