0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerAutomate(クラウドフロー)の備忘

0
Posted at

案件でPowerAutomateを利用することになりましたので、その備忘のための記録です。
読者は想定していません。そのうちきれいにしたいと思っております。

SharePointのUnicodeデコーダー(日本語プロパティをデコードするツール)

https://www.pulsar-works.jp/features/tools/sp-unicode-decoder.html
作りましたので、おいておきます。ほんとは物理名と論理名を分けたほうがいいと思いますが、そうはいかない事情もあるでしょう。

作った理由は後述。

もっとも重要なアクション

PowerAutomateで最も重要なアクションは作成です。
image.png

これはデバッグ用に、処理内部の内容をconsole.logのように出力しています。
image.png

{
  "type": "Compose",
  "inputs": {
    "trigger": "@triggerBody()",
    "a": "@variables('a')"
  }
}

最重要アクション作成特定のスコープ内で定数を定義するアクションです。

プログラマーは、特定のスコープ、例えばSwitchの先にスコープ定数を指定したいと思うでしょう。そんなとき、変数を初期化するは使えません。使えるのは作成です。

変数を初期化する変数を作成するアクションではなく、グローバル変数を作成するアクションです。なぜこんな名前がついているのか不明です。

純粋にスコープ内の変数を定義する方法はなさそうです。

「作成」はComposeをそのまま日本語にしているのでしょうが、重要性を感じず、まったく取るに足らないアクションに見えます。しかしながら、スコープ内の定数を定義する重要なアクションだと思います。

例として、「条件」の内部のアクションで、変数を初期化することはできません。(やってみてください。エラーになり保存できません。)

作成で出来たオブジェクトを取得・利用するには、「出力」というプロパティを利用します。
image.png

作成アクションのアウトプットです。

数式でのオブジェクト操作が重要

数式はWorkflow Definition Language(WDL)式というらしいです。

例えば、Teamsの承認アクションの戻り値は

"body": {
        "responses": [
            {
                "responder": {
                    "id": "id-1239das",
                    "displayName": "your-name",
                    "email": "k.ishigiwa@pulsar-works.jp",
                    "tenantId": "tenantId",
                    "userPrincipalName": "user-principal-1234-aaa"
                },
                "requestDate": "2026-02-26T11:08:31Z",
                "responseDate": "2026-02-26T11:11:07Z",
                "approverResponse": "Approve",
                "comments": "あい\nう"
            }
        ],
        "responseSummary": "要約",
        "completionDate": "2026-02-26T11:11:07Z",
        "outcome": "Approve",
        "name": "aweawfn",
        "title": "オンライン経費申請",
        "itemLink": "https://example.com",
        "requestDate": "2026-02-26T11:08:31Z",
        "expirationDate": "9999-12-31T23:59:59Z",
        "priority": "Medium"
    }
}

こんな感じです。

この構造を頭に入れないといけないので、知らないアクションや接続先の場合は、まずフローを流してデータを見るところから始めることになります。

型を強制する

特定のアクションの出力がどのような構造になるか、決まらない場合、その先にサジェストが現れません。例えば、SharePointリストを指定して、項目を取得すると、そのプロパティを類推(サジェスト)させることができますが、リストのIDを変数で受けるなど、抽象度が上がると推論がきかなくなります。

JSONの解析を利用すると、サンプルデータから型を強制することができます。

型が決まらない抽象度の高い出力にJSONの解析を行うと、その先(JSONの解析の出力)は型の類推がきいた状態になります。

アクションを途中まで一度流すと、だいたい出力でそのサンプルが取得できるので、有用です。万能ではないが。

勝手にFor-Eachになる

アクションの戻りが配列になっているとき、その戻りのプロパティを別のアクションで使おうとすると、勝手にForEachで作成されますよね。最初は戸惑いました。

例えば、ぼくは承認のコメントをSharePointリストの項目に入れようとしたのですが、戻りが配列になっていた(承認者を複数設定することができるため、コメントも複数戻ってくる)ために、Forで括られてしまいました。

これは親切な機能だなって思います。

for文内で、CurrentItem(for-eachの論点になっているアイテム)をとる

item()

または

items('Forアクションの名前')

で、対象のアイテムを取得できます。

?と[]

JSのOptionalChainみたいな感じです。nullだったら評価しない。
と思っていました。違いました。

例えば、variables('aaa')['bbb']と書いたとき、aaaがnullじゃなくても、bbbがないとエラー になります。また、aaaがnullでもエラーになります。

一方で、variables('aaa')?['bbb']と書いたとき、aaaがnullである場合のエラーは一緒 で、bbbがない場合はエラーにはなりません。

つまり、?は後ろの宣言に係る。 と分かりました。
JSのOptionalChainは前の宣言に係っているので、違っています。

item()?['comments']
は、ループ内にいるオブジェクトからcommentsを取り出す。なければ何もしない。 ことを表すようです。

条件式

条件式を条件を使って書くと不具合を起こしやすいし、ネストが深くなる。
作成を利用してWDLを書き、1,2,3やOK,キャンセル,エラーのように場合分けしてしまうほうが良さそう。それをスイッチした方が見た目に分かりやすく、分岐のログも残る。(条件内部にWDLを書いた場合ログをたどれないっぽい。やり方あったら教えてほしいです。)

ガード(Early Return)

ネストが深くなるのを避けるために、アーリーリターンをしたくなる。
終了アクションがそれです。

ただし、実行ログがちょっと汚くなる。

トリガーの条件にWDLを書けるので、そっちに書いたほうが見た目はきれい。(動かないときに原因究明ができないが。)

エラーメッセージ

保存時にエラーメッセージが出ます。赤字の。
めちゃくちゃ苦痛ですよね。問題解決の方法が載ってないし。

エラーメッセージはコピーして、VSCodeなどに貼り付け、JSONフォーマットします。

これで、問題解決の方法を探ることができます。実はちゃんとメッセージが返ってきているのですが、わけわからんメッセージで埋められて、ヒントが読めなくなっています。

Results/Value(ODataパス)

ResultsというプロパティがValueという子をもっているとき、Results/Valueのように表記できます。
例えば、SharePointリストの選択列などを作成した場合、Valueに実際の値が入っています。

また、SharePointリストの特性ですが、日本語のプロパティはUnicodeエンコードされますよね。

OData__x5408__x8a08__x91d1__x984d_

合計金額

こいつらが重なり合うと可読性がひどいことになります。

エンコードされたODataクエリをデコードするツールを作りました。
https://www.pulsar-works.jp/features/tools/sp-unicode-decoder.html

ダウンロードできます。Web上のフォームに入力すると怒られる環境の方はローカルにDLして使ってください。(Ctrl+S)

式のエスケープ

@をプロパティの先頭に入れたい場合があります。その場合は、@@とすると、@を出力できます。

入力

{
  "@@hoge" : "@variable('bar')"
}

出力

{
  "@hoge" : "barの値"
}

@が式展開に利用されるから、こういうことが起こります。

こんな現象にも遭遇しました

AIに考えてもらうには

AIにやりたいことを伝えるとき、アクションの内容をそのまま見てもらっても、AIは前後の問題を全く見ないらしく、回答に自力でたどり着けない場合が多いです。
スコープを利用して、ひとまとまりの処理にくくってしまいます。 それをコードビューで表示すると、全体像を表すJSONが現れます。これをAIに渡すと、内容が理解しやすいようです。

人間が見ても有用です。勝手にPowerAutomateのエディタが数式を書き換えていたりすることがあります。そういう時に生の設定を見るにはコードビューが有効でした。

OfficeScript

OfficeScriptはTypeScriptで書くことができます(!!)
できないことはOfficeScriptに渡して、出力をもらったほうがわかりやすいです。
Excelのデータを入出力するなどは早めにオブジェクトごとOfficeScriptへ渡したほうが保守性は良さそうです。

出力から、OfficeScript内の「console.log」を見ることができます!(素晴らしい😊) logsプロパティがそれです。

PowerAutomateの感想

WDLを知ることで苦痛を和らげることができました。
いろんなことが安全にできるのはすごいですが、仕様が一貫していない感じがします。
アクションの命名が日本人には直感的ではないですね。SharePointのアクションとかひどくて、アイテムとか項目とか、用語が一貫していないのですごくわかりにくいです。機械翻訳だからでしょうね。

Web記事も販促用の怪しいものが多く、解決策に到達するまでに時間がかかりました。すごい量のサービスに接続できるので、使いこなせれば意義があるんだろうなと思いますし、注目度も高いのかなと感じました。

0
1
0

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?