【GAS】スプレッドシートでスライドへの差し込み文書を実装【宛名印刷】

## 目的
ハガキの宛名印刷を行うのに、ワードの差し込み文書という機能でエクセルの住所録を参照する方法があるけど、データを共有するときちょっと面倒。

スプレッドシートやドキュメントなら共有がとても楽なのに、Googleには差し込み文書的な機能がない（見つけられなかっただけかも？）。というわけでGoogleAppsScriptを使って実装してみたのがこの記事。

## 概要
ハガキの雛形は、Googleスライドに郵便番号や宛名を入れるテキストボックスを設置して作成。Googleスプレッドシートの住所録をもとに、そこに宛名を入れ込んでいくのが良さそう。

流れはこんな感じ。
①スプレッドシートの住所録を取得
②スライドにページを挿入
③宛名用のテキストボックスを設置
④宛名情報をテキストボックスへ入力

宛名の数だけ②～④を繰り返す。

## 準備
スプレッドシートの住所録はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/8245f117-45e6-87b5-24c8-8a9fa1ddff27.png)

スライドのページ設定を 10×14.8cm とハガキサイズにしておく。
印刷するときも用紙サイズをハガキにする。用紙サイズにハガキが無ければ「システムダイアログを使用して印刷」から行う。

## コード
スプレッドシート側に記述。
同じことしたいとき、`'GoogleスライドのID'`以外はコピペでOK。
テキストボックスの位置だけ微調整が必要かも？

```javascript
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); //住所１
    var a2 = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX,  25, 140, 240,  20); //住所２
    var na = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX,   0, 190, 283,  40); //お名前
    var s1 = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX,  25, 342, 240,  10); //差出人住所１
    var s2 = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX,  25, 354, 240,  10); //差出人住所２
    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);
    }

    //住所１
    a1.getText().setText(data[i][1]).getTextStyle().setFontSize(13);

    //住所２（空欄なら飛ばす）
    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);

    //差出人住所１（右揃え）
    s1.getText().setText('住所１住所１住所１住所１').getTextStyle().setFontSize(10);
    s1.getText().getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.END);

    //差出人住所２（右揃え）
    s2.getText().setText('住所２住所２住所２').getTextStyle().setFontSize(10);
    s2.getText().getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.END);

    //差出人氏名（ちょっと大きめ＆右揃え）
    s3.getText().setText('苗字 名前').getTextStyle().setFontSize(13);
    s3.getText().getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.END);
  }
}
```

## 実行結果
素晴らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/5c21dabb-1ea5-35a4-ea1f-c28a15df9857.png)

## コードの補足
テキストボックスは`insertShape(shapeType, left, top, width, height)`で追加。郵便番号の位置決めが最も困難だった^^;

郵便番号を入れるとき繰り返しで記述できるよう、テキストボックスは配列で宣言。`charAt()`で1文字目から順番に入力。`charAt()`は数字に使えないので、`String()`で文字列に変換してる。スプレッドシート側で書式を変えても良いかも。

住所１は番地まで、住所２で建物名を想定しているので、住所２が空欄だったら飛ばすようにした。

`TextStyle`について、`setBold(true)`で太字、`setFontsize()`でフォントサイズを指定。`setParagraphAlignment`は、`CENTER`で中央寄せ、`STAR`、`END`で左揃え、右揃えになる。

## 検討
縦書きがよくわからなかったので横書きで作成。

差出人の郵便番号を入れたければ、宛名同様にテキストボックスを作ればOK。

シートのサイズとテキストボックスの位置を変えれば、年賀状やら封筒やらも作成可能。

最初に位置を合わせたプリンタじゃないやつで印刷したら郵便番号がズレたので、もしかしたら個体差出るかも？念のためテスト印刷をしてテキストボックスの位置を調整したほうが良さそう。

差し込みする前にスライドを全ページ削除しておかないと、既存のページに上書きしてしまう。実行の最初にページを全削除するスクリプトを足してもいいかも。

自分の住所録では敬称入れてないから、「様」はコード内で追記することにしよう。

今回使わなかったけど、テキストスタイルの指定は他にも色々あるみたい。
→ [公式リファレンス](https://developers.google.com/apps-script/reference/slides/text-style)

### おしまい