🐣

GASでesaの議事録を自動生成してslack通知

2022/10/15に公開

弊社はドキュメントや議事録を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)
}

参考

Discussion