🐣
GASでesaの議事録を自動生成してslack通知
弊社はドキュメントや議事録をesaで管理しています。
毎週担当者が議事録を作ってslackで共有してくれていたのですが、
esaのAPIを使えば全て自動化できるよなあ🤔ってことで、やってみました。
大まかな流れ
- テンプレとなるesaを事前に作っておく
- GASの定期実行で、テンプレとなるesaの本文を取得
- テンプレの本文で新しくesaの記事を作成
- 新しく作成したesaのURLをslackに通知
事前準備
esaのaccess tokenを取得する
チームのesaを開き、
SETTINGS > ユーザー設定 > Applications > Personal access tokens
readとwriteを有効にして、tokenを発行し控えておく。
実装
全体のコード
// GASのスクリプトプロパティにesaのaccess tokenとslackのwebhook URLを保存しています
// ベタ打ちでも問題はありません
const scriptProperties = PropertiesService.getScriptProperties()
const ESA_TOKEN = scriptProperties.getProperty("ESA_TOKEN")
const SLACK_WEB_HOOK_URL = scriptProperties.getProperty("SLACK_WEB_HOOK_URL")
// esa APIのリクエストURLを返す関数
// アクセストークンはパラメータで付与することも可能みたいです
const getUrl = (path) => {
return `https://api.esa.io${path}?access_token=${ESA_TOKEN}`
}
// ただ日付を取得し、返す関数
const getDate = () => {
const date = new Date()
const year = date.getFullYear()
const month = (date.getMonth() + 1)
const day = date.getDate()
return { year, month, day }
}
// テンプレとなるesaの本文を取得し、返す関数
function getTemplateEsa() {
// :team_nameにはチーム名を、:post_numberには取得したいesa URL後の番号を指定
const url = getUrl("/v1/teams/:team_name/posts/:post_number")
const context = UrlFetchApp.fetch(url).getContentText('UTF-8')
const json = JSON.parse(context)
return json.body_md
}
// テンプレを元に新しいesaを作成し、作成されたesaの記事URLを返す関数
function postEsa(title, body) {
const payload = {
"post": {
"name": title,
"body_md": body,
"tags":[],
"category": "",
"wip":false,
"message": "",
}
}
const headers = {
"Accept": "application/json",
"Content-type": "application/json",
}
const options = {
"method": "post",
"payload": JSON.stringify(payload),
"headers": headers,
}
const url = getUrl("/v1/teams/:team_name/posts")
const context = UrlFetchApp.fetch(url, options).getContentText('UTF-8')
const json = JSON.parse(context)
return json.url
}
// 任意のテキストをslackへ投稿する関数
function sendSlack(message) {
const attachments = [{
"text": message
}]
const payload = {
"attachments": attachments
}
const options = {
"method": "post",
"payload": JSON.stringify(payload)
}
UrlFetchApp.fetch(SLACK_WEB_HOOK_URL, options)
}
// GASで定期実行するメインの関数
function main() {
// テンプレの本文を取得
const body = getTemplateEsa()
// 議事録のタイトルを日付にしたいのでdateを取得して整形
const date = getDate()
const title = `ほげ/ふが/議事録/${date.year}-${date.month}-${date.day}`
// esaの記事を作成し、記事URLを取得
const esaUrl = postEsa(title, body)
// slackに投稿したい文言の作成し、投稿
const message = `議事録を作成しました!\n記入をお願いします!\n${esaUrl}`
sendSlack(message)
}
参考
- esa APIのドキュメント
- GASのスクリプトプロパティ設定方法
Discussion