40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

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 %>