Last active
January 17, 2016 09:21
-
-
Save tarao/2debfa09bc15eb21d346 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Configuration | |
var WEBHOOK_URL = PropertiesService.getScriptProperties().getProperty('webhook_url'); | |
if (!WEBHOOK_URL) throw 'You should set "webhook_url" property from [File] > [Project properties] > [Script properties]'; | |
var SLACK_USERNAME = PropertiesService.getScriptProperties().getProperty('slack_username') || 'cronsheet'; | |
var SLACK_ICON_EMOJI = PropertiesService.getScriptProperties().getProperty('slack_icon_emoji') || ':clock3:'; | |
var SHEET_NAME = PropertiesService.getScriptProperties().getProperty('sheet_name'); | |
// ... END Configuration | |
var COLUMN_QUARTER = 1; | |
var COLUMN_DOW = 2; | |
var COLUMN_START_MESSAGE = 3; | |
var MONTH_OF_QUARTER_END = { | |
'冬': 3, | |
'春': 6, | |
'夏': 9, | |
'秋': 12 | |
}; | |
var DOW_TO_INTEGER = { | |
'日': 1, | |
'月': 2, | |
'火': 3, | |
'水': 4, | |
'木': 5, | |
'金': 6, | |
'土': 7 | |
}; | |
function dateOfQuarterEnd(quarter) { | |
var m = /(^[0-9]+)(.)/.exec(quarter); | |
if (!m) return; | |
var month = MONTH_OF_QUARTER_END[m[2]]; | |
if (!month) return; | |
return new Date(parseInt(m[1], 10), month-1, 30); | |
} | |
function doPost() { | |
var now = new Date(); | |
var sheet = SHEET_NAME ? SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME) : SpreadsheetApp.getActiveSheet(); | |
var maxRows = sheet.getMaxRows(), maxCols = sheet.getMaxColumns(); | |
var headerValues = sheet.getRange(1, 1, 1, maxCols).getValues()[0]; | |
for (var r = 2; r <= maxRows; r++) { | |
var row = sheet.getRange(r, 1, r, maxCols); | |
var quarter = row.getCell(1, COLUMN_QUARTER).getValue(); | |
if (quarter) { | |
var end = dateOfQuarterEnd(quarter); | |
if (now.getTime() > end.getTime()) break; | |
} | |
var dow = (DOW_TO_INTEGER[row.getCell(1, COLUMN_DOW).getValue()]||0)-1; | |
if (dow != now.getDay()) continue; | |
var msg = new SlackMessage({ | |
username: SLACK_USERNAME, | |
icon_emoji: SLACK_ICON_EMOJI, | |
header: '<' + sheet.getParent().getUrl() + '|' + sheet.getParent().getName() + '> @' + now.toISOString() | |
}); | |
for (var c = COLUMN_START_MESSAGE; c <= row.getLastColumn(); c++) { | |
if (headerValues[c - 1].toString() === '') | |
break; | |
msg.addField(headerValues[c - 1].toString(), '' + row.getCell(1, c).getValue()); | |
} | |
var options = { | |
method: 'post', | |
payload: JSON.stringify(msg.toPayload()) | |
}; | |
var res = UrlFetchApp.fetch(WEBHOOK_URL, options); | |
if (res.getResponseCode() != 200) { | |
Logger.log(res); | |
} | |
} | |
} | |
var SlackMessage = (function () { | |
function SlackMessage(config) { | |
this.fields = []; | |
this.username = config.username; | |
this.icon_emoji = config.icon_emoji; | |
this.header = config.header; | |
} | |
SlackMessage.prototype.addField = function (title, value) { | |
this.fields.push({ title: title, value: value }); | |
}; | |
SlackMessage.prototype.toPayload = function () { | |
var payload = { | |
attachments: [ | |
{ | |
fallback: this.fields.map(function (p) { return p.title + '=' + p.value; }).join('; '), | |
pretext: this.header, | |
fields: this.fields | |
} | |
], | |
username: this.username, | |
icon_emoji: this.icon_emoji | |
}; | |
return payload; | |
}; | |
return SlackMessage; | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
これはなに?
設定方法
スプレッドシート例
スクリプト設定
webhook_url
,slack_username
,slack_icon_emoji
を[File] > [Project properties] > [Script properties]
で設定