ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【Power Automate】【TIPS】複数の関数を使用した複雑な式を組み立てる際の経験則

Power Automateで「操作 '(アクションの名前)' の入力パラメーターで無効な式を修正してください。」のエラーに苦しめられたことがあるかた向けの内容です。

今回の話はPower Automate に限った話ではなくExcel関数で複雑な式を組み立てるときにも使う手法です。

「私はこうやっている」とか「こういう時はどう対処するか聞いてみたい」とかご意見・質問ありましたら、Twitterやましゅまろで教えてください。

「無効な式を修正してください。」とは何か?

Power Automate で式の入力に誤りがあるとこのエラーメッセージが表示されます。

「操作 '(アクションの名前)' の入力パラメーターで無効な式を修正してください。」


このエラーの困るところは「式のどの箇所がどのように誤っているのかが示されない」ことです。

今回はこのエラーを回避して式を作成する経験則の話をします。

例を用いた解説

「複数の関数を使用した複雑な式」とはどんな式か、例を挙げて解説します。

数日前に下記のブログ記事でフローを解説しました。この記事で紹介している「選択」アクションに記載した式が"複雑な式"に該当します。
wataruf.hatenablog.com

この「選択」アクションに記載している式で実現している処理は以下の通りです。

  • もし、現在のitemが12の倍数であれば「3と4の倍数」という文字を返す
  • もし、現在のitemが3の倍数であれば「3の倍数」という文字を返す
  • もし、現在のitemが4の倍数であれば「4の倍数」という文字を返す
  • いずれにも該当しない場合は空の文字列を返す

その式がこちらです。

「マップ」欄:
"@{item()}": "@if(equals(mod(item(),12),0),'3と4の倍数',if(equals(mod(item(),4),0),'4の倍数',if(equals(mod(item(),3),0),'3の倍数','')))"

この式を自分でいちから組み立てるとしたら、どうやって書きますか?

複雑な式の組み立てかたで上手くいかない例

うまくいかないことが多い式の組み立て方の例を示します。

▼[課題]以下の要件を満たす式を書きなさい

  • もし、現在のitemが12の倍数であれば「3と4の倍数」という文字を返す
  • もし、現在のitemが3の倍数であれば「3の倍数」という文字を返す
  • もし、現在のitemが4の倍数であれば「4の倍数」という文字を返す
  • いずれにも該当しない場合は空の文字列を返す

一息でざざざっと書いてみました。
( ・`д・´)

※この式には誤りが何か所かあります。どこが誤りか探してみてください

エラーになってしまった。。
( ; ・`д・´)

修正1回目。
mod関数に必要なカンマが抜けていた。直した。
( ・`д・´)

エラーのままだ。。
( ; ・`д・´)

修正2回目。
カンマをいれるべきところに誤って句読点いれてた。直した。
( ・`д・´)

エラーのままだ。。
( ; ・`д・´)

修正3回目。
文字列を引用符(')で囲んでなかった。直した。
( ・`д・´)

エラーのままだ。。どこが間違っているんだ!
( ; ・`д・´)

この式の誤りは全部で4か所です。上記の3回にわたる修正それぞれでエラーの原因を解消しています。ですが、1つエラー原因が残っていることでエラーメッセージが出つづけているという状況です。

  • mod関数のカンマが抜けている
    • 修正1回目で対応した
  • カンマをいれるべき箇所に句読点(、)をいれている
    • 修正2回目で対応した
  • 文字列を引用符(')で囲んでいない
    • 修正3回目で対応した
  • 閉じ括弧がひとつ足りない
    • 未修整

4つ目の要修正点

修正点をすべて直して初めてエラーが収束します。

冒頭でお話した通りこのエラーの困るところは「式のどの箇所がどのように誤っているのかが示されない」ことです。

そのため、式を手直ししたことによって「エラーが解消された」のか「あるエラーは解消されたけれど別のエラーが残っている」のかが判断つきません。それどころか「手直しをしたことによってエラーの要因が増えた」という場合もあります。

複雑な式を記載するにはどうするか

式のどこが間違っているのかが判断つかない状況を避ける

上記の例で式のどこが間違っているのかが判断つかなくなった理由は、式の頭から最後までを一度に記載したためです。かつ、その際にエラーチェックをしなかったことも状況を複雑にした理由のひとつです。

ではどうやって式を組み立てればいいでしょうか。

式を部品にわけて作ろう

作りたい式を「意味のまとまりの単位」で部品にわけ、関数をひとつ増やすごとにエラーチェックをすること。それが式を組み立てるときのコツです。

例に挙げた課題における「意味のまとまりの単位」は以下の4つです。これらの部品をそれぞれ作っていきます。
【部品①】 もし、現在のitemが12の倍数であれば「3と4の倍数」という文字を返す
【部品②】現在のitemが4の倍数であれば「4の倍数」という文字を返す
【部品③】現在のitemが3の倍数であれば「3の倍数」という文字を返す
【部品④】いずれにも該当しない場合は空の文字列を返す

部品ごとに式を作る

まずは部品①を作る

最初に作成する部品はこちらです。

もし、現在のitemが12の倍数であれば「3と4の倍数」という文字を返す

この部品を式にしていきます。

コツは関数をひとつ加えるたびにエラーチェックをすることです。

まずはitem関数を使って「現在のitemの取得」を行います。

エラーチエックします。エラーは発生していませんね。

次にmod関数を使って「12で割った余り」を取得します。

エラーチエックします。エラーは発生していませんね。

次にequals関数を使って「割り算の余りが 0 であるかどうか(true or false)」を取得します。

エラーチエックします。エラーは発生していませんね。

次にif関数を使って「trueかfalseによって処理を分岐」させる記載をします。一旦ここでは「【Trueのとき】」と「【Flaseのとき】」と仮置きで記載しておきます。

エラーが発生しました。
式にif関数を追加した直後にエラーが発生したため、if関数の記載しかたに誤りがあることがわかります。

文字列に引用符をつけていないのがエラーの原因であることに気付きました。直しました。

エラーチエックします。エラーが収束したことがわかります。

if関数のTrue 分岐のところを「3と4の倍数」にします。

エラーチエックします。エラーは発生していませんね。

これが部品①の完成形です。

if(equals(mod(item(),12),0),'3と4の倍数','【Falseのとき】')

次に部品②を作る

次に作成する部品はこちらです。

もし、現在のitemがの4倍数であれば「4の倍数」という文字を返す

これは部品①を流用して作成できますね。

忘れずにエラーチェックをしましょう。エラーは起きてませんね。


これが部品②の完成形です。

if(equals(mod(item(),4),0),'4の倍数','【Falseのとき】')

次に部品③を作る

次に作成する部品はこちらです。

もし、現在のitemがの3倍数であれば「3の倍数」という文字を返す


これも部品①を流用して作成できますね。

忘れずにエラーチェックをしましょう。エラーは起きてませんね。

これが部品③の完成形です。

if(equals(mod(item(),3),0),'3の倍数','【Falseのとき】')

次に部品④を作る

次に作成する部品はこちらです。

いずれにも該当しない場合は空の文字列を返す

この④は③に包含される内容です。

部品③の完成形を、部品④を作成するという思考過程で以下のように変更します。具体的にはif文のfalse分岐で空の文字列を返すようにします。

変更前:
if(equals(mod(item(),3),0),'3の倍数','【Falseのとき】')

変更後:
if(equals(mod(item(),3),0),'3の倍数','')

完成した部品

▼【部品①】 もし、現在のitemが12の倍数であれば「3と4の倍数」という文字を返す
if(equals(mod(item(),12),0),'3と4の倍数','【Falseのとき】')

▼【部品②】現在のitemが4の倍数であれば「4の倍数」という文字を返す
if(equals(mod(item(),4),0),'4の倍数','【Falseのとき】')

▼【部品③】現在のitemが3の倍数であれば「3の倍数」という文字を返す
if(equals(mod(item(),3),0),'3の倍数','【Falseのとき】') ※代わりに部品④を使用する

▼【部品④】いずれにも該当しない場合は空の文字列を返す
if(equals(mod(item(),3),0),'3の倍数','')

部品①~④をマージする

部品①~④をマージして完成した式が以下の通りです。

if(equals(mod(item(),12),0),'3と4の倍数',if(equals(mod(item(),4),0),'4の倍数',if(equals(mod(item(),3),0),'3の倍数','')))

これを選択アクションにいれます。

エラーチェックをしましょう。エラーは起きてませんね。

フローを実行してみましょう。

無事実行されました。期待通りの結果が出力されました。関数が期待通り動作したことがわかります。

最後に

冒頭でお話した通り、今回の話はPower Automate に限った話ではなくExcel関数で複雑な式を組み立てるときにも使う手法です。

Power Automate の機能に関する話ではないためこれを説明することも説明をうけることもあまり機会がないと思ったので書いてみました。

全体的に雑文ですみません。何か質問があればTwitterもしくはましゅまろでご連絡ください。

今回は以上です。

[2022/11/7 追記]

件名と本文を全体的に手直ししました。

誤字や乱文がひどかったので全体的に文章を見直しました。

「試験的な機能」をオンにしよう

こんなコメントをいただきました。

こちらのことです。確かに私がフロー編集画面に式を記載するときには改行とインデントはいれていませんでした。
 ※特に大きな理由はないです。

「試験的な機能」をオンにした状態のフロー編集画面では式に改行とインデントをいれることができます。このほうが式が理解しやすいですね。

あとから式を読んだときに理解がしやすいように式には適度に改行とインデントをいれるのが良いです。(私も次からそうします)

式の入力画面が一行表示になっている場合は「試験的な機能」がオフ(既定値)になっています。

関数を扱う際にはとても便利なので「試験的な機能」はオンにすることをおすすめします。

この機能をオンにする手順およびオンにするメリットについては下記のサイトが参考になるかと思います。分かりやすくまとめられています。

参考:
www.teijitaisya.com

以上です。