こんにちは。新卒1年目の平野と申します。
さて、そろそろ年末。年賀状の季節ですね。
一人ひとりに手書きで書くのは、字が下手だし、めんどくさい。
でも、お世話になった方々に、その方ごとにふさわしい、感謝のメッセージを伝えたい!
心温かい私はそのように考えました故、
Google Apps Scriptで心温まる年賀状を作ることに致しました。
(Google Apps Scriptの基本については、弊社の秦が作成したこちらの記事をご参照ください!
【大まかな流れ】
以下画像のように、送りたい人の名前と、その人に向けたメッセージをスプレッドシートに一覧で作成します。
例えば、石田さんには、飲み会のお礼のメッセージ、徳川さんには、大阪で遊んだお礼のメッセージ、
というようにリストを作成します。
次にあらかじめ作成しておいた、Googleドキュメント上の
*お名前*に、スプレッドシートの名前を、
*メッセージ*に、スプレッドシートのメッセージを挿入して、
下のような、個別にパーソナライズされた、かわいい年賀状PDFを、大量に一括取得することを目指します。
(※左が、豊臣さんから石田さんへの年賀状、右が徳川さんへの年賀状です。)
全体の大まかな流れをまとめると、
①スプレッドシートの値を取得する。
②あらかじめ準備しておいた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文で囲み、
シートにある最後の行まで出力するように繰り返します。
④まとめ
いかがでしょうか?
それぞれの人にふさわしいメッセージ載せた年賀状を、
労少なくして作成することができました!
年賀状の表面を作成したり、
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("作成済み"); } } |
拙い内容と文章をここまでお読みいただき、ありがとうございます。
引き続き何卒よろしくお願いいたします。
平野