Googleドキュメントをテンプレートとして利用するGAS
Googleドキュメントをテンプレートとして利用するGoogle Apps Scriptをご紹介します。
概要
毎月決まった書類を人数分作成する、といった業務はありませんでしょうか?
今回は、Googleドキュメントでドキュメントのテンプレートを作成し、Googleスプレッドシートで挿入する文字列をリスト化して当てはめていく、という作業を自動化するGASを紹介致します。
準備
テンプレートとなるGoogleドキュメントの作成、および、反映するデータを入力するGoogleスプレッドシートを作成します。 今回は、どちらのファイルも同じフォルダに作成して下さい。
(1)テンプレートとするGoogleドキュメントを用意
今回は、こちらのような宛名をイメージしたテンプレートを用意します。
1行目に郵便番号、2行目に住所、4行目に宛名が表示されるようなテンプレートを用意します。
GAS処理に利用するため郵便番号、住所、宛名はそれぞれ{ }(全角)
で囲っています。
置き換える用の文字列ということが分かれば問題ないですが、後述のソースコードの解説でも記載していますが、GASで使用する上で全角の文字で囲っておいた方がトラブルが少なくなります。
(2)データの一覧を入力するGoogeスプレッドシートを用意
こちらのような、データを用意します。
今回想定しているスプレッドシートは、以下の項目を持っているリストを用意します。
「No」「郵便番号」「住所」「氏名」
GASのソースコードで開始セル、終了セルを指定することになるため、サンプルソースコードをそのまま利用する場合には、1行目にヘッダ行を作成して、2行目からデータを入力して下さい。
列もA列から入力されていることを想定しています。
GASを作成
今回は、GoogleドキュメントとGoogleスプレッドシートの両方を使うので、どちらでGASを作るか迷う方もいるかも知れません。 作成後は、データの方を更新しながら使うことになるので、Googleスプレッドシート側にGASを作成し、データの確認・更新をしてすぐに実行できるようにするとより便利になると思います。
関数を用意
こちらの空の関数を用意して、コードを作成していきます。
/**
* Googleドキュメントを作成する
*/
function makeDocs() {
}
変数定義
テンプレートとするGoogleドキュメントのIDを取得します。
// テンプレートとするドキュメントIDを設定
var docID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
// スプレッドシートのデータの範囲を設定
var dataStartRow = 2;
var dataEndRow = 10; // 実際のデータに併せて十分余裕を持った最大行数を設定
var dataStartCol = 1;
var dataEndCol = 4;
2行目のは、テンプレートとするGoogleドキュメントのIDを設定しています。
IDは、GoogleドキュメントのURLの xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
がIDとなります。
https://docs.google.com/document/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit#
特に注意が必要な変数は、 var dataEndRow = 10;
です。
データ読み込みの最大行数を設定しています。これよりデータ数を多くすると処理対象外になってしまいます。
ソースコードでは、途中でデータがなくなった場合には、そこで終了するようにしていますので、少し大きめの数字で設定するようにして下さい。
Googleスプレッドシートのデータ取得
こちらで、今開いているGoogleスプレッドシートを取得し、対象データを取得しています。
// スプレッドシートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
// スプレッドシートのデータを取得
var datalist = sheet.getRange(dataStartRow, dataStartCol, dataEndRow, dataEndCol).getValues();
Googleドキュメント作成
データのリストをfor文で繰り返しながらスプレッドシートの1行ずつを処理しながら、テンプレートとして作ったGoogleドキュメントをコピーしてドキュメントのファイルを作成していきます。
// テンプレートをコピーして、スプレッドシートのデータで置換
for (var i = 0; i < datalist.length; i++){
// データがなくなったらループを抜ける
if (datalist[i][0] === '') {
break;
}
// テンプレートをコピーしてファイル名を設定する
var docCopyID = DriveApp.getFileById(docID).makeCopy('宛名_' + datalist[i][3]).getId();
// コピーしたドキュメントを取得し、スプレッドシートのデータで文字列を置換する
var doc = DocumentApp.openById(docCopyID);
var body = doc.getBody()
body.replaceText("{郵便番号}", datalist[i][1]).replaceText("{住所}", datalist[i][2]).replaceText("{宛名}", datalist[i][3]);
}
ソースコードで行っていることは、以下のとおりです。
- 4行目は、スプレッドシートのデータが無くなったところで、for文を抜ける。
- 8行目で、テンプレートとしているGoogleドキュメントをコピーし
宛名_[スプレッドシートの宛名]
というファイル名をつける。 - 11行目で、コピーして作成したドキュメントのIDを取得する。
- 12行目で、ドキュメントの内容を取得する。
- 13行目で、「郵便番号」「住所」「宛名」をスプレッドシートのデータで置換する。
これだけで、データ分のGoogleドキュメントを作りながら、テンプレートの文字列を入力データ内容で置換することができます。
注意が必要なところとしては、文字列置換を行っている body.replaceText("{郵便番号}", datalist[i][1])
ですが、{郵便番号}
は、正規表現※ で入力します。正規表現では、[
や]
など半角文字が特殊な意味を持つことがあります。このため、今回利用している {
などは全角を使用すると不具合が出にくくなります。
※ 正規表現については、ここでは詳しく説明はしませんが、利用できるようになるととても便利です。興味ある方は、ご自身で調べてみて下さい。
オリジナルメニュー追加
最後にスプレッドシートから実行できるように、スプレッドシートにオリジナルのメニューを追加します。
/**
* オリジナルのメニューを追加
*/
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [];
menuEntries.push({ name: "宛名作成", functionName: "makeDocs" });
ss.addMenu("宛名作成メニュー", menuEntries);
}
こちらの詳細は、 Googleスプレッドシート上でのGASプログラムの実行方法 で詳細を説明していますので、参考にして下さい。
実行結果
実行すると、Googleドライブのフォルダにこちらのようなドキュメントが作成されます。
作成されたドキュメントはこちらの内容になります。
全体のソース
最後にソース全体を紹介いたします。
/**
* オリジナルのメニューを追加
*/
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [];
menuEntries.push({ name: "宛名作成", functionName: "makeDocs" });
ss.addMenu("宛名作成メニュー", menuEntries);
}
/**
* Googleドキュメントを作成する
*/
function makeDocs() {
// テンプレートとするドキュメントIDを設定
var docID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
// スプレッドシートのデータの範囲を設定
var dataStartRow = 2;
var dataEndRow = 10; // 実際のデータに併せて十分余裕を持った最大行数を設定
var dataStartCol = 1;
var dataEndCol = 4;
// スプレッドシートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
// スプレッドシートのデータを取得
var datalist = sheet.getRange(dataStartRow, dataStartCol, dataEndRow, dataEndCol).getValues();
// テンプレートをコピーして、スプレッドシートのデータで置換
for (var i = 0; i < datalist.length; i++){
// データがなくなったらループを抜ける
if (datalist[i][0] === '') {
break;
}
// テンプレートをコピーしてファイル名を設定する
var docCopyID = DriveApp.getFileById(docID).makeCopy('宛名_' + datalist[i][3]).getId();
// コピーしたドキュメントを取得し、スプレッドシートのデータで文字列を置換する
var doc = DocumentApp.openById(docCopyID);
var body = doc.getBody()
body.replaceText("{郵便番号}", datalist[i][1]).replaceText("{住所}", datalist[i][2]).replaceText("{宛名}", datalist[i][3]);
}
}
まとめ
GASで、GoogleドキュメントやGoogleスプレッドシートが使えるようになると、意外と短いコードでも便利な機能が使えるようになります。
特に、今回の様に、GoogleドキュメントとGoogleスプレッドシートのように複数のサービスを組み合わせることができると、より色々な場面で利用することができます。
ぜひ、日々の業務の効率化にお役立てください。