イベントの参加者に参加費の領収証を用意する際、
領収証の宛名を一つ一つ手打ちで入力するのは大変ですね。
参加者名簿からコピペでするだけとは言っても、
そのコピペが大変ですし、コピペに抜けがないかなどを気にし出すと、
想像以上にしんどい作業になります。
せっかく名簿もあって、領収書の形式も決まっているなら、
名前の入力くらいは自動化したいものです。
ということで、GAS(Google Apps Script)で名簿のスプレッドシートと、
ドキュメント形式のテンプレートを連携させて、
名前を自動的に挿入してみましょう。
イメージとしては下の図のような形です。
準備
準備として、名簿ファイルとテンプレートファイルを
それぞれ用意しておきます。
- 名簿ファイル(Googleスプレッドシート形式)
- テンプレートファイル(Google ドキュメント形式)
ファイルIDの確認
そして、それぞれのファイルIDを確認しておきましょう。
ファイルIDはGoogle ドライブから対象のファイルにアクセスして、
そのURLを見ることで確認できます。
URL中の/d/
の後から、/edit
の間の記号列がそのファイルのIDです。
以降のGASではこのファイルIDを頼りにファイルにアクセスします。
テンプレートファイルの挿入場所を用意
GASでの操作を行いやすくするため、
テンプレートファイル中に名前を挿入する場所を用意しておきましょう。
今回の場合は、insert_name
という文字列を、
テンプレートファイル中に用意しておきます。
GASではこの文字列を目印に名前を入力することにします。
名前が何列目にあるかを確認する
名簿ファイル内で名前が何列目にあるかを確認しておきましょう。
例で用意したファイルでは、名前は2列目に記録しています。
GASでは、この列番号を参照して名前を取り出してくることにします。
またシート名も確認しておきましょう。
シートを分けてなければデフォルトで「シート1」になります。
名前を自動入力するGAS
準備が整ったら、スクリプトを書いていきましょう。
今やりたいことは以下のような流れになります。
- 名簿から名前を取得する
- テンプレートファイルから領収書のテンプレートをコピペする
- 領収書の宛名に名前を入れる
- 全ての人の領収書が作り終えるまで、2〜3を繰り返す
これで名簿に乗っている全ての人の
領収書を綴ったドキュメントが完成します。
1.新しいドキュメントを作成する
まずは、新しいドキュメントを作成しましょう。
このドキュメントにテンプレートファイルからコピペしていき、
名前を入れた領収証を作っていきます。
ドキュメントはまっさらの状態でOKです。
ドキュメントにはGASで自動的に内容を記入していきます。
2.スクリプトエディタを開く
ドキュメントのメニューバーから
「ツール」→「スクリプトエディタ」
をクリックして、スクリプトエディタを作成していきます。
3.GASによるドキュメントファイルのコピペ関数
ファイルのコピペの部分は関数化しておきます。
テンプレートファイルの内容をコピーして、
今のドキュメントファイルに貼り付けるだけです。
function copy_template(template_id,target_body){ // template var doc = DocumentApp.openById(template_id); var bod = doc.getBody(); var paras = bod.getParagraphs(); // active for (var p=0;p < paras.length; p++){ target_body.appendParagraph(paras[p].copy()); } }
ドキュメントの内容の取得はgetParagaraphs()
メソッドで行います。
テキストとして取得してしまうと、
フォントサイズや配置の情報が消えてしまうので、
このパラグラフ形式で取得して、
パラグラフ形式で貼り付けを行います。
4.スクリプトの本体の作成
全体の処理を書いていきましょう。
下のスクリプト中の
- [テンプレートファイルのID]
- [名簿ファイルのID]
- [名簿のシート名]
- [名前の列番号]
にはそれぞれ準備で確認した内容を入れます。
template_id = "[テンプレートファイルのID]" spread_sheet_id = "[名簿ファイルのID]" function myFunction() { var doc = DocumentApp.getActiveDocument(); var bod = doc.getBody(); bod.clear(); //名簿の読み込み var ss = SpreadsheetApp.openById(spread_sheet_id); var s = ss.getSheetByName("[名簿のシート名]"); var max_row = s.getLastRow(); var names = s.getRange(2, [名前の列番号], max_row).getValues(); //名前入れ for(var i = 0;i<max_row;i++){ copy_template(template_id,bod); bod.replaceText("insert_name", names[i]); } }
ファイル中の1行目は各列のタイトルになっているので、
名簿から名前を読み込む際に、getRange
メソッドで、
2行目からデータを取得しています。
実行結果例
上のスクリプトを実行すると、
次のように領収書が綴られたドキュメントが作成されます。
テンプレートファイル中の
「insert_name」の部分に名前が挿入されていることが確認できます。
ただし、今回の例では、テンプレートファイルを
4枚で1ページになるようにサイズを調整しています。
まとめ
ファイルの決まった位置に名前を入れるというような作業は、
自動化の格好の例題です。
上では、領収書を題材に扱いましたが、
スクリプトを少し修正すれば、同様の作業の自動化もできます。
同じ作業の繰り返しだなと感じたら、
自動化のチャンスです。