ブログ移転のお知らせ
2012年3月より,本ブログは下記URLへ引越します(Tumblrの独自ドメイン機能を利用しています)。
http://blog.field-works.co.jp/
今後ともどうぞよろしくおねがいいたします。
Google Apps Script でメールをタイマー送信する方法
メールの送信を予約して,決まった日時に送りたいことがあります。
そのようなことを実現するためのアプリケーションもあるようですが,常にPCの電源を入れておく必要があります。
一方,外部のASPサービス(「ステップメールサービス」など)も存在するようですが,有料であったり,無料であってもメール本文に広告が入ったりするので,気軽に使うことができません。
そこで,Google Apps Script を使ってメールのタイマー送信を実現してみました。
スプレッドシートの作成
まずは,Googleドキュメントでスプレッドシートを作成します。
シートを一つ追加し,「template」と「schedule」という名前に変更します。
templateシートには,2行目以降にメールの件名と,メール本文のテンプレートを記入します。
件名またはメール本文中の「${ … }」という文字列は,メール送信時に可変のパラメータに置き換えられます。
scheduleシートには,送信予定日時,テンプレートの番号,宛名,メールアドレスを記入します。
templateシートの2行目のテンプレートがテンプレート番号1に対応します。
スクリプトの作成
次にスクリプトを作成します。
「ツール/スクリプトエディタ…」メニューを選択し,コードを入力します。
変数BCCには,BCCの送信先を設定します。
不要であれば,空文字列にしてください。
/** * Send mail according to a schedule. * スケジュールに合わせて自動でメールを送信する。 * * Created by: Field Works, LLC / 合同会社フィールドワークス * Reference: http://www.field-works.co.jp/ * Date: 2012/01/17 */ var BCC = 'admin@sample.com'; function format(templ, params) { return templ.replace(/\${(.*?)}/g, function($0, $1) { return (params[$1] && typeof(params[$1]) != "object") ? params[$1].toString() : JSON.stringify(params[$1]); }); } // メール本文を取得する function getMessage(ss, row, params) { var templ = ss.getSheetByName('template'); var r = templ.getRange('A2:B99'); var subject = r.getCell(row, 1).getValue(); var body = r.getCell(row, 2).getValue(); return {subject: format(subject, params), body: format(body, params)}; } // メール送信 function sendEMail(to, subject, body, opt) { try { MailApp.sendEmail(to, subject, body, opt); } catch (e) { return {result: 'NG', message: e.message}; } return {result: 'OK', message: ""}; } // 送信スケジュールをチェックする function checkSchedule() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var schedule = ss.getSheetByName('schedule'); var r = schedule.getRange('A2:F999'); var row = r.getNumRows(); var now = (new Date()).getTime(); for (var i = 1; i <= row; ++i) { // 「送信予定日時」が空ならデータの終わりと判断 if (r.getCell(i, 1).getValue() == "") { break; } var tm = r.getCell(i, 1).getValue().getTime(); var status = r.getCell(i, 5).getValue(); if (status == "" && tm < now) { // メール送信 var no = r.getCell(i, 2).getValue(); var to = r.getCell(i, 4).getValue(); var params = { TO: r.getCell(i, 3).getValue(), }; var msg = getMessage(ss, no, params); var ret = sendEMail(to, msg.subject, msg.body, {bcc: BCC}); // 処理結果を書き込み r.getCell(i, 5).setValue(ret.result); r.getCell(i, 6).setValue(ret.message); } } }
IPAmj明朝フォントの研究 ― 実装編 ―
前回の調査結果を元に Field Reports 1.4 に以下の機能を盛り込みました。
サロゲートペア対応
従来は,PDFで定義済みのCMapである「UniJIS-UCS2-H」を使ってエンコーディングを行なっていましたが,これでは1文字=2バイトのコードまでしか対応できませんでした。
そこで,フォントファイルが存在する場合はエンコーディングとして「Identity-H」を使用することにしました。
Identity-Hの場合,文字コードは(0〜65,535)のCIDベースになります(TrueTypeフォントの場合はGID)。
UnicodeからCIDへの変換は,フォント自身が持っているcmapを使って行います。
これで,サロゲートペアで表現される文字もCIDまたはGIDに変換して,PDFに埋め込むことができるようになりました。
ただし,プログラミング言語によっては2バイトを超えるUnicode文字をエスケープシーケンスなどで表現できないので,数値参照文字も使えるようにしました。
dddd; または hhhh; (ddddは10進数,hhhhは16進数)
ついでに,CIDまたはGIDで直接グリフを指定できるよう「グリフ参照文字」も使えるようにしました。
&@#dddd; または &@#xhhhh;l
異体字セレクタ
異体字セレクタ(IVS)の情報は,フォントファイルのcmapテーブルの中の「Format 14 」のサブテーブルに格納されています。
Field Reports は内部的には文字コードをUCS4で持っています。UCS4をCIDまたはGIDに変換する際に1文字先読みし,2文字目が異体字セレクタ(0x0E0100〜0x0E01EF)であれば,IVSを使って変換するようにしました。
グリフ名参照
前回触れたとおり,IPAmj明朝フォントの場合「post」テーブルにグリフ名→GIDの対応表が収納されています。
文字参照を独自拡張した「グリフ名参照」により,グリフ名を指定できるようにしました。
以下のような書式になります。
&@<グリフ名>;
使用例
以下に,サロゲートペア・異体字セレクタ・グリフ名参照を使用してPDFを作成した例を示します。
実行には,Field Reports のコマンドラインプログラムを使用しました。
下記のパラメータファイルを作成してコマンドラインプログラムに掛けると,先頭の実行例の様なPDFが作成されます。
「サロゲートペア」では,Unicode 6.0に含まれるCJK統合漢字拡張漢字B集合〜D集合の文字の一部を表示しています。
「異体字セレクタ」では,異体字セレクタを使って「邊」の異体字等を表示しています。
「グリフ名参照文字」では,IPAmj明朝に収納されている文字のうちUCSが未実装かつIVS実装されていない7,160文字の一部を表示しています。
{ "resources": { "font": { "IPAmjMincho": { "path": "./ipamjm.ttf", "embed": true, "subset": true } } }, "template": {"size": "A4"}, "context": { "text": [ { "new": "Tx", "font": "IPAmjMincho", "font-size": 14, "rect": [50, 750, 550, 780], "value": "【サロゲートペア】" }, { "new": "Tx", "font": "IPAmjMincho", "font-size": 24, "multiline": true, "rect": [50, 650, 550, 750], "charref": true, "value": "𠀋𠂉𠂢𠂤𠆢 𠈓𠌫𠍱𠎁𠏹𠑊𠔉 𠗖𠘨𠝏𠠇𠠺𠢹𠥼 𠦝\n𪜖𪜩𪜪𪜬𪜸𪜽 𪝆𪝒𪝘𪝟\n𫝀𫝁𫝂 𫝃𫝄𫝅𫝆𫝇𫝉𫝊 𫝌𫝍" }, { "new": "Tx", "font": "IPAmjMincho", "font-size": 14, "rect": [50, 600, 550, 630], "value": "【異体字セレクタ】" }, { "new": "Tx", "font": "IPAmjMincho", "font-size": 24, "multiline": true, "rect": [50, 500, 550, 600], "value": "\u9089\U000E010F\u9089\U000E0119\u9089\U000E011B \u9089\U000E011A\u9089\U000E011C\u9089\U000E011D\u9089\U000E0117 \u9089\U000E0116\u9089\U000E0115\u9089\U000E0114\u9089\U000E0118 \u9089\U000E0113\u9089\U000E0112\u9089\U000E0111\u9089\U000E0110\n \u908A\U000E0108\u908A\U000E0109\u908A\U000E010A\u908A\U000E010B \u908A\U000E010C\u908A\U000E010D\u908A\U000E010E\u908A\U000E010F \u908A\U000E0110\n葛飾区 葛\U000E0102城市/蓮田市 蓮\U000E0104田市" }, { "new": "Tx", "font": "IPAmjMincho", "font-size": 14, "rect": [50, 450, 550, 480], "value": "【グリフ名参照文字】" }, { "new": "Tx", "font": "IPAmjMincho", "font-size": 24, "multiline": true, "rect": [50, 350, 550, 450], "charref": true, "value":"&@mj000007;&@mj000008;&@mj000012;&@mj000022;&@mj000023; &@mj000028;&@mj000029;&@mj000036;&@mj000037;&@mj000045;&@mj000046; &@mj000047;&@mj000048;&@mj000073;&@mj000074;&@mj000089;&@mj000105; &@mj000106;&@mj000129;&@mj000130;&@mj000143;&@mj000144;&@mj000145; &@mj000146;&@mj000156;&@mj000157;&@mj000175;&@mj000176;&@mj000183; &@mj000184;&@mj000185;&@mj000206;&@mj000207;&@mj000208;&@mj000209; &@mj000241;&@mj000242;&@mj000264;&@mj000265;&@mj000266;&@mj000267; &@mj000269;&@mj000270;&@mj000276;&@mj000277;&@mj000278;&@mj000302; &@mj000303;&@mj000309;&@mj000310;&@mj000311;&@mj000312;&@mj000317; &@mj000318;&@mj000332;&@mj000333;&@mj000380;&@mj000381;&@mj000405; &@mj000406;" } ] } }
Jimdoでソースコードを整形して表示するならPygmentsが便利
Webサイトにソースコードを整形して貼り付ける時の定番は,SyntaxHighlighterのようです。
ただ,SyntaxHighlighter付属のCSSファイルをサイトにアップロードする必要があり,Jimdoで使うのはちょっと面倒なので躊躇していました。
先日,Pygmentsというソフトを見つけたので試してみました。
Pygmentsとは
Pythonで作成された“syntax highlighter”で,Sphinx, rts2pdf, Trac, GitHubなど様々なプロダクトで使用されています。
以下の出力形式に対応しています。
インストール
easy_installがインストールされていれば,pigmentsのインストールは非常に簡単です。
$ sudo easy_install pygments
使い方
pigmentsをインストールすると,pygmentizeというコマンドラインプログラムが作られます。
以下のように実行すると,HTMLのコード片が作成されます。
$ pygmentize -f html -l ruby -o foo.html foo.rb
出力されたHTMLを表示するのに必要なスタイル指定は,以下のコマンドで作成できます。
`default'スタイルでは,61行のコンパクトなCSSが出力されました。
$ pygmentize -S default -f html > pygments.css
スタイル指定を含んだHTMLを出力したい場合は`-O full'オプションを付けます。
$ pygmentize -f html -O full -l ruby -o foo.html foo.rb