ExcelとOutlook連携なツール作る時にUnderscore.js使ってみた
自分の仕事柄、いろいろな人とアポ調整して、日程確定した段階で、その旨のメールを念のため送る作業が毎日発生します。
これまでは、手作業でやっていたのですが、現状、自分の業務落ち着いてることもあって、前から作ろうと思っていた、Excel & Outlook 連携のツールを作りました
3年ほど前にWSH上でPrototype.jsを使って楽しようというエントリを書いた時には、ちょっと小細工をしてprototype.jsを使ってWindowsのWSH環境で利用できるツールを細々書いていました。
Titaniumの開発時に最近Underscore.js 活用していたので、深く考えずにwsfファイルを準備して
<job> <script language="javascript" src="lib/underscore.js"/> <script language="javascript"> var outlook = new Outlook(); var data = [{name:"xx"},{name:"xx-xx"}]: _.each(data,function(d){WScript.Echo(d);}); </script> </job>
みたいにしたら、普通に使えました!
まぁ、Windows環境でこんなことが必要になる人はほとんどいないと思うけど、折角なのでソースコード以下にまとめておこうと思います
ソースコード
outlook.js
var Outlook = function(){ this.version = "1.0"; this.Apps = WScript.CreateObject("Outlook.Application"); this.basePath = "C:\\list\\"; }; Outlook.prototype.readTemplate = function(fileName){ var fso = new ActiveXObject("Scripting.FileSystemObject"); var ForReading = 1; if(typeof fileName === "undefined"){ var file = this.basePath + "template.txt"; }else{ var file = this.basePath +fileName; } WScript.Echo( file); var template = fso.OpenTextFile(file,ForReading,false ); var contents = template.readAll(); template.close(); return contents; }; Outlook.prototype.excelOperate = function (){ // Excelオブジェクトを取得(Excelの起動) var ExcelApp = new ActiveXObject( "Excel.Application" ); // Excelアプリケーションを表示 ExcelApp.Visible = false; var book = ExcelApp.Workbooks.Open( "C:\\list\\sendlist.xls" ); var sheet = book.Worksheets( 1 ); // Excel内をパース var result = ; var r = 0; while(1) { if (sheet.Cells(2+ r, 1).value == null) break; var ary = ; var c = 0; var sendToName = sheet.Cells(2+ r, 1).value; var mailAddress = sheet.Cells(2+ r, 2).value; var mailSubject = sheet.Cells(2+ r, 3).value; var reservedDate = convertDateFormat(new Date(sheet.Cells(2+ r, 7).value)); result.push( { "sendToName":sendToName, "mailAddress":mailAddress, "mailSubject":mailSubject, "reservedDate":reservedDate }); r++; } WScript.Sleep( 1000 ); // Excelを終了 ExcelApp.Quit(); WScript.Echo( "終了" ); // オブジェクトを解放 ExcelApp = null; return result; }; function convertDateFormat(dateObj){ var month = dateObj.getMonth() + 1 + "月"; var date = dateObj.getDate() + "日"; var dayList = [ "日", "月", "火", "水", "木", "金", "土"]; var day = "(" + dayList[dateObj.getDay()] + ") "; if (dateObj.getHours() >= 12){ var _temp = dateObj.getHours() - 12; var hour = "午後" + _temp.toString() + "時"; }else{ var hour = "午前" + dateObj.getHours() + "時"; } if( dateObj.getMinutes() === 0){ var miniutes = "00分"; }else{ var miniutes = dateObj.getMinutes() + "分"; } return [ month,date, day,hour ,miniutes ].join(""); }
main.wsf
<job> <script language="javascript" src="lib/underscore.js"/> <script language="javascript" src="outlook.js"/> <script language="javascript"> var outlook = new Outlook(); var data = outlook.excelOperate(); var template = outlook.readTemplate("baseTemplate.txt"); var compiled = _.template(template); _.each(data,function(d){ var objMAIL = outlook.Apps.CreateItem(0); objMAIL.To = d.mailAddress; objMAIL.Subject = d.mailSubject; objMAIL.Cc = 'xxxx@xxxx.xxxx.xxx'; objMAIL.Body = compiled(d); objMAIL.display(); }); </script> </job>
baseTemplate.txt
<%= sendToName %>様 お世話になります。 何らかのメッセージ <%= reservedDate %>