こんにちは。新卒1年目の平野と申します。

さて、そろそろ年末。年賀状の季節ですね。
一人ひとりに手書きで書くのは、字が下手だし、めんどくさい。
でも、お世話になった方々に、その方ごとにふさわしい、感謝のメッセージを伝えたい!

心温かい私はそのように考えました故、
Google Apps Scriptで心温まる年賀状を作ることに致しました。
(Google Apps Scriptの基本については、弊社の秦が作成したこちらの記事をご参照ください!

【大まかな流れ】

以下画像のように、送りたい人の名前と、その人に向けたメッセージをスプレッドシートに一覧で作成します。
例えば、石田さんには、飲み会のお礼のメッセージ、徳川さんには、大阪で遊んだお礼のメッセージ、
というようにリストを作成します。
1_スプレッドシート
次にあらかじめ作成しておいた、Googleドキュメント上の
*お名前*に、スプレッドシートの名前を、
*メッセージ*に、スプレッドシートのメッセージを挿入して、

3_ドキュメント

下のような、個別にパーソナライズされた、かわいい年賀状PDFを、大量に一括取得することを目指します。
(※左が、豊臣さんから石田さんへの年賀状、右が徳川さんへの年賀状です。)

2_完成pdf3_完成_2

全体の大まかな流れをまとめると、
①スプレッドシートの値を取得する。
②あらかじめ準備しておいたGoogleドキュメントの元本を複製して、
該当部分に、名前とメッセージを挿入する。
③PDFで保存して、不要なファイルは削除する

という流れです。
では詳細に見ていきましょう。

①スプレッドシートの値を取得する。

まず、名前・メッセージの書いてあるスプレッドシートを取得します。
変数Sheetの中身は、”一覧”という名前のシートが入ります。

var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var Sheet = Spreadsheet.getSheetByName("一覧");

次に、以下のように、getRangeで指定したセルの値をgetValue()で取得します。
シートの1列目が名前なので、nameに代入し、
2列目がメッセージなので、messageに代入していきます。

var name = Sheet.getRange(i+2,1).getValue();
var message = Sheet.getRange(i+2,2).getValue();

これで値の取得が完了です。

②ドキュメントに挿入

あらかじめ準備しておいたGoogleドキュメントを複製して、
該当部分に名前やメッセージを挿入していきましょう。

まず、元本となるGoogleドキュメントのファイルを開きます

var file = DriveApp.getFileById("***id***");

DriveApp.getFileById(“***id***”)で、IDに該当するファイルを取得して、fileに代入します。
ちなみにこの”***id***”の中はIDは、ファイルのURLの、d/と/editの間の部分です。
(上記画像の青い部分です。)
これで、fileに、元本となるGoogleドキュメントが代入されました。

それを、年賀状裏コピーという名前をつけて複製し、
そのIDを取得して、googleドキュメントを開きます。

var copy_file=file.makeCopy("年賀状裏コピー");
var copy_id =copy_file.getId();
var doc = DocumentApp.openById(copy_id);

コピーしたGoogleドキュメントの中身(Body)を取得して、
本文の*お名前*にnameを、*メッセージ*をmessageに置き換えます。
そして、ファイルを保存して閉じます。

var body =doc.getBody();
body.replaceText('*お名前*',name);
body.replaceText('*メッセージ*', message);
doc.saveAndClose();

スプレッドシートや、ドキュメントは、
通常の使用時だと、勝手に保存されますが、スクリプト上だと
saveAndCloseを書かないと、保存されず、
PDFにしたときに、文字がきちんと置き換わらないので要注意です。

③PDFで保存する

PDFで保存して、不要なファイルは削除していきます。

まず、好きな名前をつけてドキュメントをPDFにしてみましょう。
私は「○○様_年賀状2016_裏」という名前をつけることにします。

var pdfname=name+"様_年賀状2016_裏";

次の2行で、PDFが作成することができます。

var pdf = doc.getAs("application/pdf");
var compPdf=DriveApp.createFile(pdf).setName(pdfname);

※保存するpdfのサイズがA4になってしまいますが、
手紙サイズで印刷すれば問題なく年賀状に印刷できます。

マイドライブ直下にPDFが保存されている状態なので、
お好きなフォルダに、ファイルを移動しましょう。

移動したいフォルダのIDを確認しておいて、
そのIDで開いてfolderに代入。folderに、pdfを追加(add)しましょう。

var folder = DriveApp.getFolderById('**ここは移動したいフォルダのIDです**')
folder.addFile(compPdf);

このままだとマイドライブと、該当フォルダの両方から参照できるので、
マイドライブからのパスを削除します。

var mydrive=DriveApp.getRootFolder();
mydrive.removeFile(compPdf);

そして最後に、元本をコピーしたGoogleドキュメントは不要なので、
ゴミ箱に移動します。

copy_file.setTrashed(true);

①②③で、
年賀状の完成です!

あとは、①②③をfor文で囲み、
シートにある最後の行まで出力するように繰り返します。

4_年賀状

④まとめ

いかがでしょうか?
それぞれの人にふさわしいメッセージ載せた年賀状を、
労少なくして作成することができました!

年賀状の表面を作成したり、
pdfを添付して自動でメールできるようにすると、
さらに良いかもしれませんね。

(参考)
Google Developers Google Apps Servies
https://developers.google.com/apps-script/reference/calendar/

全ソースはこちら。

function MakeNewYearLetters(){

  //名前・メッセージの書いてあるスプレッドシートを取得する
  var Spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var Sheet = Spreadsheet.getSheetByName("一覧")

  //一番最後の行までの行数から1を引いた数が、繰り返す回数
  //なので、getLastRow()で最終行を取得して、-1をする
  var lastRow = Sheet.getLastRow();
  var roopNum=lastRow-1;

  //繰り返し
  for(var i=0;i<roopNum;i++){

    //3列目のステータスが、作成済みかどうかをチェックする。
    var sentflag = Sheet.getRange(i+2,3).getValue();
    if(sentflag==="作成済み"){
      continue;
    }

    //シートの値を取得する。1列目が名前なので、nameに代入
    //シートの値を取得する。2列目がメッセージなので、messageに代入
    var name = Sheet.getRange(i+2,1).getValue();
    var message = Sheet.getRange(i+2,2).getValue();

//------裏面の処理-------//

    //元本のファイルを開く(年賀状裏)
    var file = DriveApp.getFileById("**自分のファイルのIDを入れてください**");

    //元本をコピーする
    var copy_file=file.makeCopy("年賀状裏コピー");

    //コピーしたファイルのIDを取得
    var copy_id =copy_file.getId();

    //コピーしたファイルを開く
    var doc = DocumentApp.openById(copy_id);

    //コピーしたファイルのbodyを取得して、
    //「*お名前*」と「*メッセージ*」を、nameとmessageに置き換え
    var body =doc.getBody();
    body.replaceText('*お名前*',name);
    body.replaceText('*メッセージ*', message);

    //セーブして閉じる
    doc.saveAndClose();

    //ドキュメントに、名前をつけて、pdfとして取得する
    var pdfname=name+"様_年賀状2016_裏";
    var pdf = doc.getAs("application/pdf");
    var compPdf=DriveApp.createFile(pdf).setName(pdfname);

    //保存したいフォルダのIDを指定して、作成したpdfを追加する
    var folder = DriveApp.getFolderById('**自分のファイルのIDを入れてください**')
    folder.addFile(compPdf);

    //このままだとマイドライブからも参照できる状態なので、削除する。
    var mydrive=DriveApp.getRootFolder();
    mydrive.removeFile(compPdf);

    //元本をコピーしたドキュメントはゴミ箱に移動する
    copy_file.setTrashed(true);

    //送信済みフラグを立てる
    Sheet.getRange(i+2,3).setValue("作成済み");

  }

}

拙い内容と文章をここまでお読みいただき、ありがとうございます。
引き続き何卒よろしくお願いいたします。

平野