Office365(Microsoft365)で、ユーザーオペやスケジュールをトリガーに自動起動する連携処理を実装するのに便利なPowerAutomateですが、実際に業務の中で使おうとするといろいろな制約があります。
そのような制約を克服するため思いついたり調べたりした内容をご紹介していこうと考えています。
Background
Power AutomateはO365に統合されているので、SharePoint Online(SPO)のリストに対して、項目(要素)の参照&更新を行うことができます。
SPOリストの列のデータ型には「一行テキスト」や「数値」などとともに「ハイパーリンク」というものもあります。当該型のカラムに設定したテキストは、SPOの画面表示上、文字通りハイパーリンクとして表示され、クリックすると画面遷移が発生します。
ハイパーリンクはデータの内部表現としては Url
と Description
という2つのプロパティを持っており、リストの項目を追加したり更新したりする際に表示されるフォームでは「URL」と「代替テキスト」という名前で表されています:
ここまではなんてことのない話だと思います。
Problem
ところで、現時点(2021年5月頃)では、Power Automateでリスト項目を追加したり更新したりするときに使用するアクションは、ハイパーリンク型の列の Url
と Description
の個別指定はサポートされておらず、 Url
と同じ値が Description
にも設定されてしまいます。 1
実際に「項目の作成」や「項目の更新」でリスト項目のハイパーリンク型の列に値を設定するとこんなかんじです:
Solution
幸いにも(驚くべきことに?)PowerAutomateにはSPOのRESTfulAPIに直接リクエストを送りつけるためのアクションが用意されています。今回はこのアクションを使います。
簡便のため次のようなステップを踏んで、ハイパーリンクの Description
を設定してみましょう:
- 「項目の作成」アクションで項目を追加(この時点ではハイパーリンクのUrlのみ設定される)
- 「SharePointにHTTP要求を送信します」アクションで項目を更新(この時点でハイパーリンクのDescriptionも設定される) 2
まずは「項目の作成」アクションで、目的のリストに項目を追加します。この時点ではご覧の通り、Urlしか指定しません(指定できません):
続いて「SharePointにHTTP要求を送信します」アクションで項目を更新します。ここでDescriptionを指定します:
「URL」欄には以下の要領で入力をします:
_api/web/lists/GetByTitle('<リスト表示名>')/items(<リスト項目ID>)
リスト表示名とリスト項目ID以外は固定です。リスト表示名はSPOサイト画面上で表示されているリスト名です。
SPOではリスト表示名とは別にリスト名(内部名とも呼ばれる)を持っており、2つは区別されています。リストを作成するとき、数字で始まる名称やアルファベット以外の文字を含む名称を指定すると、リスト表示名とリスト名(内部名)は乖離します。リスト名(内部名)を確認する方法は後述します。
「ヘッダー」欄の内容は固定です:
キー | 値 |
---|---|
Content-Type | application/json;odata=verbose |
X-HTTP-Method | MERGE |
IF-MATCH | * |
「ボディ」欄には以下の要領でJSON文字列を指定します:
{
"__metadata": {
"type": "SP.Data.<リスト名>ListItem"
},
"Link":{
"Description": "<代替テキスト>",
"Url": "<URL>"
}
}
先程「URL」に記載したのはリスト表示名でしたが、今度「ボディ」に記載したのはリスト名(内部名)であることに注意をしてください。
リスト名(内部名)はSPOでリストを表示した時、ロケーションバーに表示されるURLで判断できます:
https://<ドメイン名>/<中間パス>/Lists/<リスト名>/AllItems.aspx
このフローを動かしたあと、SPO画面で項目を確認すると、ご覧のように「代替テキスト」が設定されたことを確認できます:
「ローコード開発」の現実を見る思いですが、Power Automateに精通するに従ってこうした知識が増えていくのかもしれません。。