エクセルの特定背景色の行のみSlackへ通知する

# <i class="fa fa-cubes"></i> 概要

エクセルで管理しちゃっている情報をなんとかエクセルを開かず内容チェックしたい。

今調べたいエクセルシートは状態をセルの背景色で管理しているので、未処理のものだけでも毎日チェックして報告してもらいたい。

# <i class="fa fa-code"></i> コード

実際にはネットワーク上のディレクトリにあるので、
マシンにはマウントしてそのパスで参照、
出力にはネットワークへのパスに変換する処理を追加しています。

```js

var target = 'C:/Users/{user}/Desktop/tmp/hoge.xlsx'

var XLSX = require('xlsx');
var workbook = XLSX.readFile(target, {cellStyles:true});
var worksheet = workbook.Sheets[workbook.SheetNames[0]];

var Slack = require('slack-node')
var slack = new Slack()
slack.setWebhook('自分のSlackの投稿先')

var sendSlack = (text, attachments) => {
	slack.webhook({
		text:text,
		channel:'#random',
		username: '検討状況',
		icon_emoji: ':stopwatch:',
		attachments: attachments,
	}, (err, response)=>{
	})
}

var makeAttachment = (title, color, fields) => {

	return {
		title:title,
		title_link:target,
		color:color,
		fields,fields,
	}
}

var makeField = (title, value)=> {
	return {title:title, value:value, short:true}
}

var fetchInfo = (sheet, number) => {
	return {
		title: worksheet['B' + i].v,
		priority:worksheet['D' + i].v,
		make:worksheet['E' + i].w,
		author:worksheet['F' + i].v,
		limit:worksheet['G' + i].w,
	}
}


var statMessage = {'FF0000':'未検討','FFFF00':'検討中'}

var attachments = [];

for(var i = 9; cell = worksheet['A' + i]; i++) {

	var fields = [];

	switch (cell.s.fgColor.rgb) {
		case 'FF0000': // 未検討
		//case 'FFFF00': // 検討中 長くなりすぎるのでコメントアウト
			var info = fetchInfo(worksheet, i)
			fields.push(makeField('状況', statMessage[cell.s.fgColor.rgb]))
			fields.push(makeField('優先度', info.priority))
			fields.push(makeField('記入者', info.author))
			fields.push(makeField('記入日', info.make))
			fields.push(makeField('解決期限', info.limit))
			attachments.push(makeAttachment(info.title, cell.s.fgColor.rgb, fields))
			break;
	}
	attachments.push(makeAttachment(cell))
}

sendSlack('検討状況\n' + target, attachments)


```

今回の対象は`An`の背景色で状態、同行に固定列で情報が入っているので、対象セルの横列を参照していきます。

オプションで`{cellStyles:true}`にしてやることと、
今回のエクセルでは`bgColor`ではなく`fgColor`にセルの色が入っていることに注意。

# <i class="fa fa-camera"></i> Slack通知サンプル

![エクセルパースJPG.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/27551b97-896d-ac7a-4667-030b3553b8e7.jpeg)

# <i class="fa fa-flask" aria-hidden="true"></i> 使用ライブラリ

* [clonn/slack-node-sdk: slack.com, slack, node sdk]  
Node.jsから簡単にSlackへ通知出来ます。
* [SheetJS/js-xlsx: XLSX / XLSM / XLSB / XLS / SpreadsheetML (Excel Spreadsheet) / ODS parser and writer]  
エクセルブックをパースします。パーサーは色々あるのですが、Documentsの時点でスタイルまで扱えると分かるものは少なかったです。

# <i class="fa fa-info" aria-hidden="true"></i> その他参考

* [guyonroche/exceljs: Excel Workbook Manager]  
こちらも良さそうなパーサーなのですが、今回の対象ファイルはエラーでパースできませんでした。
* [paulmillr/chokidar: A neat wrapper around node.js fs.watch / fs.watchFile / fsevents.]  
Node.jsでファイルの変更を監視するなら。  
今は定期チェックですが、リアルタイム性が欲しい場合に。

[clonn/slack-node-sdk: slack.com, slack, node sdk]:https://github.com/clonn/slack-node-sdk
[SheetJS/js-xlsx: XLSX / XLSM / XLSB / XLS / SpreadsheetML (Excel Spreadsheet) / ODS parser and writer]:https://github.com/SheetJS/js-xlsx
[guyonroche/exceljs: Excel Workbook Manager]:https://github.com/guyonroche/exceljs
[paulmillr/chokidar: A neat wrapper around node.js fs.watch / fs.watchFile / fsevents.]:https://github.com/paulmillr/chokidar