JScriptでUnderscore.js使ってExcelとOutlook連携なツールを作る

自分の仕事柄、いろいろな人とアポ調整して、日程確定した段階で、その旨のメールを念のため送る作業が毎日発生します。

こういうのを手作業ですると、誤送信の可能性が高くなるし、数通とはいえ意外と面倒なので、Excel ＆ Outlook 連携のツールを作りました。

会社のPCがWindowsマシンで、処理系を自由に入れられないという人（＝＞自分^^;）もいると思うのでそういう人の役に立てばと思ってます。

## 事前準備

- Cドライブ直下にlistというフォルダを作成して
- [Underscore.js](http://underscorejs.org/)をダウンロードしてlistフォルダにlibというフォルダを作成して、そのlibフォルダ内に配置します。
- メールのテンプレートとなるファイルとしてbaseTemplate.txtを作成してlist直下に置く
 

## Outlookを操作するoutlook.jsを作成する

以下のようなコードを書きます。

```javascript
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("");

}
```

## WSFファイルを準備する

こんな感じのWSFファイルを作成します。

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

以上です。