アドベントカレンダーを成功させるためのDX

f:id:kubotak:20211203133527p:plain この記事はM&Aクラウドアドベントカレンダー2021の記念すべき1日目の記事です。

みなさんこんにちはこんばんは、M&AクラウドでWebエンジニアをしている久保田(@kubotak_public)です。

M&Aクラウドとしての初めてのアドベントカレンダーです。
詳しくは以下の記事を見ていただけると嬉しいです。

update.macloud.jp

さて、今回弊社のアドベントカレンダーを行うにあたって私が実行委員として旗振り役となりました。
今年のアドベントカレンダーの目標はズバリ、「だれも記事を落とさずに公開すること」です。
簡単かな?とも思われる目標ですが、今回のアドベントカレンダーを担当するメンバーはWebエンジニアだけではありません。
つまり「アドベントカレンダー?なにそれ?」と馴染みのない方も多いと思われます。

Webエンジニアであれば12月には「記事書かなきゃ」とソワソワすることが多いのではないでしょうか。
ということで、実行委員としてみんなに”ソワソワ”してもらうためのリマインダーを作りました。

f:id:kubotak:20211128230650p:plain

このような形で公開の3営業日前にSlackで担当者あてに通知が行われます。 今流行のNoCode、と言いたいところですが一部JavaScriptを利用しています。

アーキテクチャは次のようになっています。

f:id:kubotak:20211128232644p:plain
アーキテクチャ

①zapier

タスク自動化ツールであるzapierを利用して定期実行を作成します。
zapierではあらゆるサービスの連携だけでなく、プログラミングコード(Python, JavaScript)を実行させることができます。

Googleスプレッドシート

Googleスプレッドシートにはアドベントカレンダーの記事を書く担当者名やSlackメンション用のユーザーID、担当日などを管理します。
f:id:kubotak:20211128233245p:plain

zapierではまずこのスプレッドシートのデータを読み出します。

JavaScript

続いてCode by Zapierを利用してJavaScriptを実行します。
先程のスプレッドシートのデータを加工しつつ、実行したタイミングから3営業日後の担当者を抽出する処理を作ります。
ここで気をつけなければならないのは休日の扱いです。
アドベントカレンダーには休日も関係なく記事を公開する必要があります。ですが、例えば休日に3日後の通知を送るというのは些か会社としてよろしくないですよね?
ということで通知が行われるのは平日のみに限定し、3営業日前通知ということに設定したいので土日を挟むことを考慮した通知設計が必要です。
幸い(?)にも12月は祝日がありません。祝日を考慮する必要がないので簡単に次のようなルールで通知を設計しました。

const scheduleList = [
    [], // 日曜日 -> 通知なし
    [3], // 月曜日 -> 木曜日
    [3], // 火曜日 -> 金曜日
    [3, 4, 5], // 水曜日 -> 土・日・月曜日
    [5], // 木曜日 -> 火曜日
    [5], // 金曜日 -> 水曜日
    [], // 土曜日 -> 通知なし
];

scheduleListの配列内の数値は、実行した日付に加算する日付を表しています。ですので、コメントに付いているように月曜に実行された場合は3日後の木曜の担当に通知、水曜に実行された場合は3日後、4日後、5日後のそれぞれ土、日、月曜の担当に通知を送る設計です。

スプレッドシートとCode by Zapierの落とし穴

この実装を作っているときにちょっとした落とし穴がありました。
zapierで取得したスプレッドシートの行は、JavaScriptで配列として受け取れると思ってましたが文字列で取得されました。
カンマ区切りの文字列なのでCSVとしてパースできるのかな?と思ったんですが改行コードがなかったので仕方なく列のサイズで別配列になるようにパースしました。

const { rows } = inputData;
const rowsToArray = rows.split(',');
const rowsFormatted = [];
let i = 0;
let row = [];
rowsToArray.forEach((item) => {
    ++i;
    row.push(item)
    if (i > 8) {
        rowsFormatted.push(row);
        row = [];
        i = 0;
        return;
    }
}); 

④Slack

JavaScriptの処理が実行されると次のようなデータが生成されます。

output = [{ result: true, message }]

通知する内容がある場合はresultがtrueとなり、ない場合(土日や開始日前や終了後)はfalseとなります。
Filter by Zapierを利用して後続のタスクを実行するかどうかを分岐させます。

最後にSlackへの通知を実行することで一連の処理が完了します。

さいごに

今年のM&Aクラウドアドベントカレンダーのテーマは「テック」です。
実行委員として「テックを利用してアドベントカレンダーの旗振りを行う」を実践できたのではないかと思います。
本日を皮切りに25日まで、弊社エンジニアのみならずあらゆる業種の面々が記事を投稿します!ぜひご期待ください。