クイックノート

ちょっとした発見・アイデアから知識の発掘を

【GAS】領収書への名前入れ作業を自動化する

イベントの参加者に参加費の領収証を用意する際、
領収証の宛名を一つ一つ手打ちで入力するのは大変ですね。

参加者名簿からコピペでするだけとは言っても、
そのコピペが大変ですし、コピペに抜けがないかなどを気にし出すと、
想像以上にしんどい作業になります。

せっかく名簿もあって、領収書の形式も決まっているなら、
名前の入力くらいは自動化したいものです。

ということで、GAS(Google Apps Script)で名簿のスプレッドシートと、
ドキュメント形式のテンプレートを連携させて、
名前を自動的に挿入してみましょう。

イメージとしては下の図のような形です。

f:id:u874072e:20190620152543p:plain
ドキュメントへの名前入れを自動化

準備

準備として、名簿ファイルとテンプレートファイルを
それぞれ用意しておきます。

ファイルIDの確認

そして、それぞれのファイルIDを確認しておきましょう。

ファイルIDはGoogle ドライブから対象のファイルにアクセスして、
そのURLを見ることで確認できます。

f:id:u874072e:20190620153246p:plain
GoogleドライブでファイルIDを確認

URL中の/d/の後から、/editの間の記号列がそのファイルのIDです。

以降のGASではこのファイルIDを頼りにファイルにアクセスします。

テンプレートファイルの挿入場所を用意

GASでの操作を行いやすくするため、
テンプレートファイル中に名前を挿入する場所を用意しておきましょう。

今回の場合は、insert_nameという文字列を、
テンプレートファイル中に用意しておきます。

f:id:u874072e:20190620153734p:plain:w300

GASではこの文字列を目印に名前を入力することにします。

名前が何列目にあるかを確認する

名簿ファイル内で名前が何列目にあるかを確認しておきましょう。

例で用意したファイルでは、名前は2列目に記録しています。

GASでは、この列番号を参照して名前を取り出してくることにします。

f:id:u874072e:20190620154055p:plain:w200

またシート名も確認しておきましょう。
シートを分けてなければデフォルトで「シート1」になります。

名前を自動入力するGAS

準備が整ったら、スクリプトを書いていきましょう。

今やりたいことは以下のような流れになります。

  1. 名簿から名前を取得する
  2. テンプレートファイルから領収書のテンプレートをコピペする
  3. 領収書の宛名に名前を入れる
  4. 全ての人の領収書が作り終えるまで、2〜3を繰り返す

これで名簿に乗っている全ての人の
領収書を綴ったドキュメントが完成します。

1.新しいドキュメントを作成する

まずは、新しいドキュメントを作成しましょう。
このドキュメントにテンプレートファイルからコピペしていき、
名前を入れた領収証を作っていきます。

ドキュメントはまっさらの状態でOKです。

ドキュメントにはGASで自動的に内容を記入していきます。

2.スクリプトエディタを開く

ドキュメントのメニューバーから
「ツール」→「スクリプトエディタ」
をクリックして、スクリプトエディタを作成していきます。

f:id:u874072e:20190620155526p:plain:w300

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行目からデータを取得しています。

実行結果例

上のスクリプトを実行すると、
次のように領収書が綴られたドキュメントが作成されます。

f:id:u874072e:20190620161211p:plain:w200
自動名前入れの結果例

テンプレートファイル中の
「insert_name」の部分に名前が挿入されていることが確認できます。

ただし、今回の例では、テンプレートファイルを
4枚で1ページになるようにサイズを調整しています。

まとめ

ファイルの決まった位置に名前を入れるというような作業は、
自動化の格好の例題です。

上では、領収書を題材に扱いましたが、
スクリプトを少し修正すれば、同様の作業の自動化もできます。

同じ作業の繰り返しだなと感じたら、
自動化のチャンスです。

プライバシーポリシー