🦔

Notionで契約管理DBを作成して、更新前にslack通知

2024/11/06に公開

はじめに

契約のことをNotionに書き始めた。書いてることはこんな感じ

  • 更新日
    • 日付。更新したら来年に手動更新する
  • ステータス
    • 例:契約中、候補、解約済み、無料契約
  • 事業範囲
  • FAQ
    • オンボーディングのここ見てね!なページに主要契約(≒SaaS)のFAQのリンクを書いている
  • 手順
    • 機密情報は書いてないけど、それ以外の手順は記載している
  • 環境のDB
    • 例えばkintoneのAppのDBなどを本文に置いている。Appを書いたのはそれぞれのAppの使用方法などを書くため。

Notionを選んだのはmarkdownが使用できることと、画像が添付しやすいことだが、通知がネックなのでGASでプログラムを書いた。

code

main.gs
function alertSaaSUpdate(){
  const alertList = getSaaSList().reduce((alertList, saas) => {
    const alertText = saas.getAlertText();
    if(alertText) alertList.push(alertText);
    return alertList;
  }, []);
  
  if(!alertList.length) return;
  slackChannel(
    <slack token>,
    '契約更新確認\n\n' + alertList.join('\n')
  );
}
SaaS.gs
class SaaS{
  constructor(json){
    this.name = json.properties.契約名.title.map(t => t.plain_text).join('');
    this.status = json.properties.ステータス.status.name;
    this.tagList = json.properties.タグ.multi_select;
    this.updateDate = dayjs.dayjs(
      json.properties['契約更新日'].date?.start ? json.properties['契約更新日'].date?.start : '-'
    );
  }

  getAlertText(){
    if(this.status === '契約中' && dayjs.dayjs().add(4, 'months').isAfter(this.updateDate)){
      return `契約確認 ${this.name}, 更新日${this.updateDate.format('YYYY/MM/DD')}`;
    }
  }

  getUpdateDate(){
    return this.updateDate;
  }
}
notion.gs
const NOTION = {
  token: <token>,
  db: {
    saas: <id>,
  },
};



function getSaaSList(){
  return Notion.initManager(NOTION.token).query(NOTION.db.saas).map(json => new SaaS(json));
}

なお、「Notion」とは以下のライブラリ
https://zenn.dev/nag8/articles/4fa5aa95f69577

結果

やっぱりプログラミングしたほうが柔軟に通知設定できるな〜

Discussion