目的
ハガキの宛名印刷を行うのに、ワードの差し込み文書という機能でエクセルの住所録を参照する方法があるけど、データを共有するときちょっと面倒。
スプレッドシートやドキュメントなら共有がとても楽なのに、Googleには差し込み文書的な機能がない(見つけられなかっただけかも?)。というわけでGoogleAppsScriptを使って実装してみたのがこの記事。
概要
ハガキの雛形は、Googleスライドに郵便番号や宛名を入れるテキストボックスを設置して作成。Googleスプレッドシートの住所録をもとに、そこに宛名を入れ込んでいくのが良さそう。
流れはこんな感じ。
①スプレッドシートの住所録を取得
②スライドにページを挿入
③宛名用のテキストボックスを設置
④宛名情報をテキストボックスへ入力
宛名の数だけ②~④を繰り返す。
準備
スライドのページ設定を 10×14.8cm とハガキサイズにしておく。
印刷するときも用紙サイズをハガキにする。用紙サイズにハガキが無ければ「システムダイアログを使用して印刷」から行う。
コード
スプレッドシート側に記述。
同じことしたいとき、'GoogleスライドのID'
以外はコピペでOK。
テキストボックスの位置だけ微調整が必要かも?
function mergePrint() {
//シートを丸っと取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = sheet.getDataRange().getValues();
//プレゼンテーションを指定
var presentation = SlidesApp.openById('GoogleスライドのID');
//シート2行目から1行ずつ繰り返し
for(var i=1; i<data.length; i++){
//スライドを1枚追加&追加したページを取得
presentation.appendSlide();
var slide = presentation.getSlides()[i-1];
//テキストボックス設置 insertShape(shapeType, left, top, width, height)
var zip = [];
zip[0] = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 122, 29, 20, 30);
zip[1] = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 142, 29, 20, 30);
zip[2] = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 162, 29, 20, 30);
zip[3] = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 184, 29, 20, 30);
zip[4] = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 204, 29, 20, 30);
zip[5] = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 224, 29, 20, 30);
zip[6] = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 244, 29, 20, 30); //郵便番号
var a1 = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 25, 120, 240, 20); //住所1
var a2 = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 25, 140, 240, 20); //住所2
var na = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 0, 190, 283, 40); //お名前
var s1 = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 25, 342, 240, 10); //差出人住所1
var s2 = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 25, 354, 240, 10); //差出人住所2
var s3 = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 25, 368, 240, 20); //差出人氏名
//テキストボックスに入力
//郵便番号
for(var j=0; j<7; j++){
zip[j].getText().setText(String(data[i][0]).charAt(j)).getTextStyle().setFontSize(20);
}
//住所1
a1.getText().setText(data[i][1]).getTextStyle().setFontSize(13);
//住所2(空欄なら飛ばす)
if(data[i][2]){
a2.getText().setText(data[i][2]).getTextStyle().setFontSize(13);
}
//お名前(太字&中央揃え)
na.getText().setText(data[i][3]).getTextStyle().setBold(true).setFontSize(25);
na.getText().getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);
//差出人住所1(右揃え)
s1.getText().setText('住所1住所1住所1住所1').getTextStyle().setFontSize(10);
s1.getText().getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.END);
//差出人住所2(右揃え)
s2.getText().setText('住所2住所2住所2').getTextStyle().setFontSize(10);
s2.getText().getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.END);
//差出人氏名(ちょっと大きめ&右揃え)
s3.getText().setText('苗字 名前').getTextStyle().setFontSize(13);
s3.getText().getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.END);
}
}
実行結果
コードの補足
テキストボックスはinsertShape(shapeType, left, top, width, height)
で追加。郵便番号の位置決めが最も困難だった^^;
郵便番号を入れるとき繰り返しで記述できるよう、テキストボックスは配列で宣言。charAt()
で1文字目から順番に入力。charAt()
は数字に使えないので、String()
で文字列に変換してる。スプレッドシート側で書式を変えても良いかも。
住所1は番地まで、住所2で建物名を想定しているので、住所2が空欄だったら飛ばすようにした。
TextStyle
について、setBold(true)
で太字、setFontsize()
でフォントサイズを指定。setParagraphAlignment
は、CENTER
で中央寄せ、STAR
、END
で左揃え、右揃えになる。
検討
縦書きがよくわからなかったので横書きで作成。
差出人の郵便番号を入れたければ、宛名同様にテキストボックスを作ればOK。
シートのサイズとテキストボックスの位置を変えれば、年賀状やら封筒やらも作成可能。
最初に位置を合わせたプリンタじゃないやつで印刷したら郵便番号がズレたので、もしかしたら個体差出るかも?念のためテスト印刷をしてテキストボックスの位置を調整したほうが良さそう。
差し込みする前にスライドを全ページ削除しておかないと、既存のページに上書きしてしまう。実行の最初にページを全削除するスクリプトを足してもいいかも。
自分の住所録では敬称入れてないから、「様」はコード内で追記することにしよう。
今回使わなかったけど、テキストスタイルの指定は他にも色々あるみたい。
→ 公式リファレンス