LoginSignup
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-02-27

前書き

この記事のやり方で、以下のような投稿を行う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
  3. You can use dark theme
What you can do with signing up
0