koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

日本の祝日をAsanaに登録する

みなさん、来週の月曜日(2022-07-18)が祝日だって知ってましたか?

僕は知りませんでした。僕の所属チームには同じように知らない人が数名いました。

するとどうなるか? タスク管理ツール上、祝日に堂々とタスクが配置された状態になります。

これは良くない。丸1日予定が狂います。

というわけで、日本の祝日を一括してタスク管理ツールに登録しました。

こうなった

チームではタスク管理にAsanaというSaaSを使っています。

Asanaにはマイルストーンという概念があって、タイムライン表示時にはいつどんなマイルストーンがあるか? が分かりやすく表示されます。はたして祝日がマイルストーンかどうかは分かりませんが、マイルストーンとして祝日を登録しておけば「この日は休みだ」と分かります。きっと祝日にタスクを配置してしまうこともなくなるでしょう。

マイルストーンがある日付は縦線が伸びるので祝日を意識できる

こうやった

AsanaにはいろいろできるAPIが用意されていて、公式のクライアントライブラリもいくつかの言語で提供されています。

今回はそのうちNodeのものを使ってみました。

日本の祝日はGoogleカレンダーの日本の祝日カレンダーを参照しました。

github.com

処理部分はこんな感じです。

import ical from "node-ical";
import asana from "asana";

const now = new Date();

const events = await ical.async.fromURL(
  "https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics"
);
const upsertEvents = Object.values(events)
  .filter((e) => e.start)
  .filter((e) => e.start > now);

const targetProjectIds = process.env.ASANA_PROJECT_IDS.split(",");

const client = asana.Client.create().useAccessToken(process.env.ASANA_TOKEN);
const me = await client.users.me();

console.log(me);

for (const event of upsertEvents) {
  console.log(event);
  const task = await client.tasks.create({
    name: event.summary,
    due_at: event.start,
    projects: targetProjectIds,
    resource_subtype: 'milestone',
  });
  console.log(task);
}

当初は継続的に更新しようかと思っていたのですが、一度登録してしまったら1年以上は更新不要な見込みとなった(来年の祝日も登録された)ので初心は忘れることにしました。

来年の自分や他の人に期待してまずはこの一年祝日にタスクを予定しないように生きていきたいと思います。