ics ファイルを作成する Power Automate での Flow の作り方

# ics ファイルとは
Web サイトで何らかの予約やイベント、勉強会に登録して、**[予定表に追加]** みたいなボタンがあって、クリックするとなんかファイルがダウンロードされて、ファイルを開くと Windows 環境の人なら Outlook が開いて、予定に追加される

スマホでもおんなじような動きになりますよね。

<blockquote class="twitter-tweet"><a href="https://twitter.com/yugoes1021/status/1214057651102896129"/></blockquote>

ダウンロードしてるファイルは ics という拡張子で iCalendar と呼ばれる形式で国際規格で定義された標準フォーマットです。国際規格なので様々なソフトで開くことができます。詳細は Wikipedia を参照してください。

https://ja.wikipedia.org/wiki/ICalendar

さて **"ics ファイル作成"** や **"iCalendar ファイル作成"** と検索すると、そのフォーマットは簡単に理解できます。本記事ではフォーマットの詳細は説明しませんので、まずは簡単に検索して理解しておくことをお勧めします。（覚える必要はありません）

いくつか検索すると構造を説明しているサイトに出会いますが、ここのサイトがわかりやすかったです。
https://hacknote.jp/archives/23977/

以下にフォーマットの例を示します。

```sample.ics
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
TZID:Asia/Tokyo
TZURL:http://tzurl.org/zoneinfo-outlook/Asia/Tokyo
X-LIC-LOCATION:Asia/Tokyo
BEGIN:STANDARD
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
TZNAME:JST
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20200106T053007Z
DTSTART;TZID=Asia/Tokyo:20191205T104500
DTEND;TZID=Asia/Tokyo:20191205T114500
SUMMARY:POWA10-Microsoft PowerApps と Microsoft Power Platform を活用したすべてのユーザーのアプリおよびプロセスのデジタル化の実現
DESCRIPTION:
LOCATION:Theater 3
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:POWA10-Microsoft PowerApps と Microsoft Power Platform を活用したすべてのユーザーのアプリおよびプロセスのデジタル化の実現
TRIGGER:-PT15M
END:VALARM
END:VEVENT
END:VCALENDAR
```

ポイントになるのは以下です

**BEGIN:xxxx** と **END:xxxx** で囲んで各値を設定する

1. DTSTAMP: 作成日
1. DTSTART: 開始日時
1. DTEND: 終了日時
1. SUMMARY: タイトル
1. DESCRIPTION: 本文
1. LOCATION: 場所

なのでちょっと最低限必要なものに絞るとこんな感じになります

```sample_light.ics
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
DTSTART:20191205T104500
DTEND:20191205T114500
SUMMARY:POWA10-Microsoft PowerApps と Microsoft Power Platform を活用したすべてのユーザーのアプリおよびプロセスのデジタル化の実現
DESCRIPTION:
LOCATION:Theater 3
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
END:VEVENT
END:VCALENDAR
```

ね、これなら作れそうでしょ？上記のポイントとなる 6 つの項目の値を良きように置き換えるフローを **Power Automate** で作成すればよいのです。

# Power Automeate で作成するフローの全体像
こんな感じです。私は HTTP リクエストの Get で呼びたかったので **HTTP トリガー [HTTP要求の受信時]** を使用していますが、例えば Power Apps からなんらかのアクションで呼びたければ、トリガーを Power Apps の要求に置き換えてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/57fd6f6f-7d01-487b-4e50-cee2abaa69c8.png)

変数にしているのは **[作成]** で置き換えたい値を入れておきたかったからです。変数を使わなくても可能ですが、後に何らか変更をする時にわかりづらくなるので、私は変数を使用するようにしています。（単なる私の好みです）

さてそれでは順に見ていきましょう。

## HTTP 要求の受信時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/f9eb77b0-ac93-4f11-bead-dc1e6e88314b.png)

非常にシンプルです。GET メソッドでリクエストを受け取りたいだけですから、JSON スキーマは空です。私の場合、冒頭の動画のように Power BI Report からリンクで呼び出したかったので、JSON が投げられないという制限がありました。ゆえに GET でかつ URL パラメータで必要な値を投げつけています。

呼出し元で POST にて JSON が投げられるのであれあ、JSON スキーマを定義して method を POST にしてあげてください。（Web のお作法からするとむしろそちらの方が正しいです）

```リクエスト.url
https://prod-XX.japaneast.logic.azure.com/workflows/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&ics-FileName=POWA10&DTSTART=20191205T104500&DTEND=20191205T114500&SUMMARY=POWA10-Microsoft%20PowerApps%20と%20Microsoft%20Power%20Platform%20を活用したすべてのユーザーのアプリおよびプロセスのデジタル化の実現&DESCRIPTION=&LOCATION=Theater%203
```

ちなみに私の場合は **Flow** を呼び出す際の **URL** を以下のように作成しています。こうすることで必要なデータを **URL パラメータ** で渡すことが可能です。
**[URLパラメータで渡す Key と Value]** 

1. ics-FileName=POWA10
1. DTSTART=20191205T104500
1. DTEND=20191205T114500
1. SUMMARY=POWA10-Microsoft%20PowerApps%20と%20Microsoft%20Power%20Platform%20を活用したすべてのユーザーのアプリおよびプロセスのデジタル化の実現
1. DESCRIPTION=
1. LOCATION=Theater%203

= の前が **Key** で = の後ろが **Value** なので、**Value** の方を可変にして **URL** を作成してください。

## JSON の解析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/87deaf33-25db-7b14-e843-50a08c3961c9.png)

HTTP リクエストトリガーに渡された URL パラメータを取得するには画像の [コンテンツ] のところに以下のような式を記入します。

```
triggerOutputs()['queries']
```
**[式]** に上記の式を入力したら **OK** をクリックしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/28a1504c-d9e6-d88e-bcca-3fc59e33c9a4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/430c8fe6-77b4-cf63-f899-4a64003afdac.png)

これで URL のパラメータに自分で付与した **Key 名** の値が取得できます。ここでは扱いやすいように **[JSON の解析]** を使用して **JSON** に変換しています。

```shema.json
{
    "type": "object",
    "properties": {
        "ics-FileName": {
            "type": "string"
        },
        "DTSTART": {
            "type": "string"
        },
        "DTEND": {
            "type": "string"
        },
        "SUMMARY": {
            "type": "string"
        },
        "DESCRIPTION": {
            "type": "string"
        },
        "LOCATION": {
            "type": "string"
        }
    }
}
```

私と同じ URL パラメータ名で作成するなら上記をコピーしてください。

## 各変数の初期化
**[新しいステップ]** から検索ボックスに **"変数"** と入力して **[変数を初期化する]** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/e6138be3-b4fa-e040-e21e-ff220105c2cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/d11bf369-429c-ec0d-70b8-c128289adbef.png)
**[名前]** は任意の名前、**[種類]** は文字列、**[値]** は右側の動的なコンテンツから **[JSON の解析]** - 該当の項目 を選択してください。
これを各変数分繰り返します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/1fd52771-9cf2-6364-36e9-368f94f035c9.png)

## 現在の時刻～タイムゾーンの変換
**[新しいステップ]** から検索ボックスに **"日付"** と入力して **[現在の時刻]** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/c7bfbb13-9bf4-8dfc-2a37-e98a95783d53.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/fe88d9a5-3ab2-5c89-4d80-25369d403fca.png)
**[現在の時刻]** は設定値がないので、何もしなくて OK です
再び **[新しいステップ]** から検索ボックスに **"日付"** と入力して、今度は **[タイムゾーンの変換]** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/a9fa2550-8b94-f21a-1110-cd3c27e7041f.png)
以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/22873e8e-cdee-e307-d4d2-6fd239c0322a.png)
**「あれ？なんか変じゃない？？」**と思われた方、**正解**です。そう、ここでは **タイムゾーン** は **変換してません**。タイムゾーンではなく、書式設定をしています。これは私がよくやる方法なのですが、実はこの **[タイムゾーンの変換]** を使わなくても、関数で書式設定をすることは可能です。が、関数を使うと、プログラミング経験のない方にとってハードルがクンっと上がってしまうので、ポチポチっとできる **[タイムゾーンの変換]** を利用しています。関数でできる方はどうぞ関数でやってください

Power Automate の関数 - formatDateTime() :
https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#formatdatetime

## ics フォーマットの作成
**[新しいステップ]** から検索ボックスに **"データ操作"** と入力して **[作成]** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/430f6cea-613c-58c1-bf20-2c73b91d9c6d.png)
作成に冒頭の ics のフォーマットを貼り付け、動的に変えたい項目を該当の項目に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/d90f28e5-1b5f-78fa-5d27-e7eecef33996.png)

Light版の場合はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/55461733-5b91-1bb7-1157-856487c15e8d.png)

## 応答
**[新しいステップ]** から検索ボックスに **"要求"** と入力して **[応答]** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/d8262ced-5f33-3f8d-a3dd-00e2b0e0160f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/b43a1efb-305a-f17e-3b76-b6dbe189ca45.png)

|項目|値|
|:---|:---|
|状態コード|200|

**[ヘッダー]**
Content-Type: text/plain
Content-Disposition: attachment;filename=@{variables('iCS-FileName')}.ics

あとは **[本文]** に **[出力]** を指定してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/53b590f2-3cf8-d9f0-62ac-b22424dbae89.png)

これで完成です。

# 動作確認
名前を付けてフローを保存したら **[HTTP 要求の受信時]** トリガーに HTTP GET の URL が作成されますので、右端のボタンで URL をコピーして、後ろに URL パラメータを付けて、動作確認をしてみてください。[Postman](https://www.getpostman.com/) を使用すると簡単です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/c2e2f96b-970d-cabf-07ce-bb5fa82fbda8.png)

# おわりに
いがかでしたでしょうか？ちゃんと動作しましたか？？
もしうまく動作しなかった場合は、もういちど最初から設定を読み直してみてください。焦らずやれば、絶対にできますよ😉

Power Automate を楽しんでくださいねー😁