今年も年賀状の季節が。


始めるまでが面倒くさいのですが、書いてる時と、もらった年賀状を見てるときはこの文化いいなぁといつも思います。


うちは毎年、フリーソフトで自作しております。以前は某年賀状ソフトでやってたのですが、PCを替えたら入ってなくて、そこからデザイン面は某プリンターメーカーのソフトと宛名面は日本郵政の公式アプリで対応してました。


ところが、数年前から日本郵政のアプリが、宛名のお家プリントに非対応になりました?去年はどうしたんだっけなぁ…と思いつつ、住所録をエクセルで管理してたので、それを某プリンターメーカーのアプリにインポートできるようなcsvにメンテして、いよいよプリントしようとしたところ、なんとアプリでプリンターが認識されず…。プリンターはそんなに古くはないのですが、アプリが対応してないような情報もありました。どっちも同じメーカーなのに、そんなことある!?


他のアプリを探したのですが、お店プリントのものばかり…。仕方ない、作るか…。なるべく金と時間をかけずに。というわけで、Googleスプレッドシートで自作しました。ニーズがあるかはわかりませんが、概要を書きます。スマホだけで完結できないのと、PCで使うのですが、プリント時に一手間必要なのが欠点です。


■住所録はこんな感じ。郵便番号はハイフン無し、住所と宛名は改行のとこにカンマ打つ。


■レイアウトはこんな感じ。1mm=5pixで、ちょっと複雑ですが、下図のようにセルを設定。

■スクリプトはこんな感じ。
function hagakika() {

  var sheet,shtHagaki,lastRow,shtNew,shtJushoroku,yubinNo,eleMent,arrayJusho,aryJuSu,arrayAtena,aryAteSu,yubin
  sheet = SpreadsheetApp.getActiveSpreadsheet();
  sheetName = sheet.getSheetName();

  shtHagaki = sheet.getSheetByName("5pix_mm");
  shtJushoroku = sheet.getSheetByName("list");

  yubin = [17,21,25,29,33,36,39];

  lastRow = shtJushoroku.getLastRow();

  for (var i=2; i<=lastRow; i++) {
    shtHagaki.activate();
    sheet.duplicateActiveSheet();
    sheet.getActiveSheet().setName(i);
    shtNew = sheet.getSheetByName(i);

    yubinNo = String(shtJushoroku.getRange(i,1).getValue());
    arrayJusho = shtJushoroku.getRange(i,2).getValue().split(",");
    aryJuSu = arrayJusho.length;
    arrayAtena = shtJushoroku.getRange(i,3).getValue().split(",");
    aryAteSu = arrayAtena.length;

    for (var j=0; j<7; j++) {
      eleMent = yubinNo.substr(j,1);
      shtNew.getRange(2, yubin[j]).setValue(eleMent); 
    }

    switch (aryJuSu) {
      case 1:
        shtNew.getRange(3,32,2,9).activate().merge().setVerticalAlignment('top');
        eleMent = String(arrayJusho[0]);
        eleMent = eleMent.replace(/-|ー/g,"❘");
        shtNew.getRange(3,32).setValue(eleMent).setFontSize(24);
      break
      case 2:
        shtNew.getRange(3,32,2,5).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,37,2,4).activate().merge().setVerticalAlignment('top');
        eleMent = String(arrayJusho[1]);
        eleMent = eleMent.replace(/-|ー/g,"❘");
        if (arrayJusho[1].length < arrayJusho[0].length) {
          for (var m=0; m<=arrayJusho[0].length-arrayJusho[1].length; m++) {
            eleMent = " " + eleMent;
          }
        } else {
          eleMent = " " + eleMent;
        }
        shtNew.getRange(3,32).setValue(eleMent).setFontSize(24);
        eleMent = String(arrayJusho[0]);
        eleMent = eleMent.replace(/-|ー/g,"❘");
        shtNew.getRange(3,37).setValue(eleMent).setFontSize(24);
      break
    }

    switch (aryAteSu) {
      case 1:
        shtNew.getRange(3,12,2,20).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,12).setValue(arrayAtena[0]).setFontSize(46);
      break
      case 2:
        var arrayElement = arrayAtena[0].split(/s/);
        for (var k=0; k<=arrayElement[0].length; k++) {
          arrayAtena[1] = " " + arrayAtena[1];
        }
        shtNew.getRange(3,12,2,10).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,12).setValue(arrayAtena[1]).setFontSize(46);
        shtNew.getRange(3,22,2,10).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,22).setValue(arrayAtena[0]).setFontSize(46);
      break
      case 3:
        var arrayElement = arrayAtena[0].split(/s/);
        for (var k=0; k<=arrayElement[0].length; k++) {
          arrayAtena[1] = " " + arrayAtena[1];
          arrayAtena[2] = " " + arrayAtena[2];
        }
        shtNew.getRange(3,12,2,5).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,12).setValue(arrayAtena[2]).setFontSize(36);
        shtNew.getRange(3,17,2,8).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,17).setValue(arrayAtena[1]).setFontSize(36);
        shtNew.getRange(3,25,2,7).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,25).setValue(arrayAtena[0]).setFontSize(36);

      break
      case 4:
        var arrayElement = arrayAtena[0].split(/s/);
        for (var k=0; k<=arrayElement[0].length; k++) {
          arrayAtena[1] = " " + arrayAtena[1];
          arrayAtena[2] = " " + arrayAtena[2];
          arrayAtena[3] = " " + arrayAtena[3];
        }
        shtNew.getRange(3,12,2,5).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,12).setValue(arrayAtena[3]).setFontSize(26);
        shtNew.getRange(3,17,2,5).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,17).setValue(arrayAtena[2]).setFontSize(26);
        shtNew.getRange(3,22,2,5).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,22).setValue(arrayAtena[1]).setFontSize(26);
        shtNew.getRange(3,27,2,5).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,27).setValue(arrayAtena[0]).setFontSize(26);

      break
      case 5:
        var arrayElement = arrayAtena[0].split(/s/);
        for (var k=0; k<=arrayElement[0].length; k++) {
          arrayAtena[1] = " " + arrayAtena[1];
          arrayAtena[2] = " " + arrayAtena[2];
          arrayAtena[3] = " " + arrayAtena[3];
          arrayAtena[4] = " " + arrayAtena[4];
        }
        shtNew.getRange(3,12,2,4).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,12).setValue(arrayAtena[4]).setFontSize(22);
        shtNew.getRange(3,16,2,4).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,16).setValue(arrayAtena[3]).setFontSize(22);
        shtNew.getRange(3,20,2,4).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,20).setValue(arrayAtena[2]).setFontSize(22);
        shtNew.getRange(3,24,2,4).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,24).setValue(arrayAtena[1]).setFontSize(22);
        shtNew.getRange(3,28,2,4).activate().merge().setVerticalAlignment('top');
        shtNew.getRange(3,28).setValue(arrayAtena[0]).setFontSize(22);

      break
    }
 }
};


 ■使い方は、スクリプト実行して、出来たシートをPDFで保存する。その際、サイズはハガキ、余白は各5mm、枠線はプリントしない。出来たPDFをハガキにプリントします。わざわざPDF保存しているのは、Googleスプレッドシートからプリントする際、某メーカーのプリンタードライバーではプリントレイアウトをいじれないためです。余白やプリント範囲や枠線なしの設定ができません。

たぶん正味2時間強くらいかかりました。年賀状ソフト買った方が良かったかも?自作のメリットは、フォントやレイアウトが思い通りにできるところです。市販ソフトだと異様にフォント小さくなるのが、以前から不満だったので、まあ、良かったのかな。