LoginSignup
0

posted at

updated at

Organization

【GAS無し】Googleスプレッドシート + Slack Workflowのみで祝日通知を作成する

前書き

この記事のやり方で、以下のような投稿を行うSlack Workflowを作成することができます。
スクリーンショット 2023-02-28 0.17.42.png

この記事で紹介するやり方は、GASや特別なAPI作成や契約を必要とせず、GoogleスプレッドシートとSlack Workflowで完結し、自動更新にも対応しています。
あまり知識が無い状態で作成しているので、何か改善点など有りましたら教えて頂けると助かります。

やり方

この記事では、主に祝日管理用スプレッドシートの作成方法に関して解説します。
Slack Workflowの作成方法やスプレッドシートを参照する方法に関しても軽く解説します。

なお、Slack Workflowでスプレッドシートを使用するには、公式から提供されているGoogle Sheets for Workflow Builderを導入する必要が有ります。
申請など必要なら先に済ませることをお勧めします(自分の環境では導入済みでした)。

祝日管理スプシの作成方法

スプシのサンプルは以下のURLに置いてあります。
ご自身で用意したシートに上2行をコピーしてご利用下さい(後述の理由から、最初は表示エラー状態になります)。
加える日数セルを適当な日数に変更し、フォーマット済みセルの結果表示セルだけSlack投稿に組み込めば、それで動きます。

スクリーンショット 2023-02-28 10.13.54.png

このスプシに関しては、特にリロードすると表示エラーが出ることを確認しています。
そうなった場合、今日セルの値を一度消してから戻すことで、表示エラーを解消できます。
一応表示エラーが起きている間も通知は正常に動くようでした。

表示エラー時のスクショ

スクリーンショット 2023-02-28 10.14.04.png

以下、このスプシでやっていることを解説します。

集計期間の指定

まず、B2:D2の範囲で集計期間を設定しています。

今日 加える日数 集計末日
=today() 100 =B2+C2

サンプルでは期間を100日としていますが、ここを14にすれば2週間、0にすれば今日だけ、と調整することができます。

祝日の取得

祝日は今年・来年の祝日セルで取得しています。

今年・来年の祝日
= { IMPORTDATA("https://holidays-jp.github.io/api/v1/" & Year(B2) & "/date.csv", ","); IMPORTDATA("https://holidays-jp.github.io/api/v1/" & Year(B2) + 1 & "/date.csv", ",") }

祝日の取得には @matsuoshi 様の公開されている日本の祝日一覧を返す APIを利用させて頂きました。
こちらのAPIhttps://holidays-jp.github.io/api/v1/2023/date.csv というように、年指定で祝日一覧を取得することができます。
データソースはGoogleカレンダーで、期間的には去年〜来年分まで取得できるそうです。

これらのセルでは、今日から取得した年を使ってAPIを実行し、結果をIMPORTDATA関数で取り込んでいます。
このシートでの取得対象は、年末年始を考慮して来年分までとしています。

追記
GAS無し・スプレッドシートのみで祝日カレンダーを作成できたので、外部APIに依存するのがどうしても嫌という方はこちらをご利用下さい。
上で紹介している方法とデータソースは同じです。

補足: こちらのAPIを採用した理由

こちらのAPIを採用した理由は、無料かつCSVで取得できることです。

まず、記事執筆時点で、Googleスプレッドシートがデフォルトで読み込めるのはCSV等の限られたデータだけでした。

https://support.google.com/docs/answer/12188454?hl=ja

他のAPIもいくつか確認しましたが、CSVで結果を提供しているものは見つからなかったです。
Googleの提供する祝日カレンダーの生データ(ICSを利用することも考えましたが、残念ながらGAS無しで利用する方法は見つけられませんでした(正確には、頑張って解析することも不可能ではなさそうでしたが、難しそうだったため諦めました)。 追記した通り、こちらはできるようになっています。
また、内閣府の公開しているCSVは文字化けで読めなかったため、利用しませんでした。

集計期間内の祝日の切り出し

追記
=IFNA(FILTER(E2:F40, (B2 <= E2:E40) * (G2:G40 <= D2)))とすることで、下記で紹介しているフィルタリングはまとめられます。


集計期間内の祝日の切り出しはフィルタ済み1(今日以降)フィルタ済み2(今日以降集計末日まで)で行なっています。

フィルタ済み1(今日以降) フィルタ済み2(今日以降集計末日まで)
=FILTER(E2:F40, B2 <= E2:E40) =FILTER(G2:H40, G2:G40 <= D2)

やっていることはヘッダの通りですが、シンプルなやり方が分からず、2段階に分けて「今日以降集計末尾まで」を切り出しています。

投稿用にフォーマット

最後に、フォーマット済みセルで投稿用にフォーマットした文字列を用意しています。

フォーマット済み
=IF(ISBLANK(I2), "なし", TEXTJOIN(CHAR(10), TRUE, MAP(I2:I40, J2:J40, LAMBDA(date, label, IF(ISBLANK(date), "", CONCATENATE(TEXT(date, "yyyy/MM/dd(ddd)"), ": ", label))))))

範囲内に祝日が無ければなし、有る場合は2023/03/21(火): 春分の日というようなフォーマットを改行で結合した文字列になります。

Slack Workflowの作成について

実際に利用しているSlack Workflowに設定している内容を簡単に書きます。
この辺りは他の解説記事の方が詳しいと思われるため、ここでは詳細までは書きません。

Select spreadsheet rowステップ

Select spreadsheet rowステップでは以下を設定しています。

  • Select a spreadsheet -> 作成したスプシ
  • Sheet -> 作成した祝日管理シート
  • Choose a column to search -> LOOKUP(※サンプルシートのA1セル)
  • Define a cell value to find -> TRUE(※同A2セルの値)

Send a messageステップ

上のステップを経ることで、Insert a variableSelect a spreadsheet rowセクションから、作成したスプシ内の値を変数として取り込むことができます。

おまけ: この方針を選んだ理由

この方針のキモは、スプシとSlack Workflowを扱える人間なら誰でもメンテナンスできることです。
仮に利用可能な祝日APIが無くなったとしても、年1回のメンテナンスだけで済むなら手動で十分運用できるでしょう。

検索で見つかったGASなどに依存する方針を採用しなかったのは、この辺りのことを考えたからです。
弊社内ではSlack Workflowからスプシを参照するのも一般的なやり方だったため、そちらは問題になりませんでした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0