【PowerAutomate】アレイのフィルター処理が失敗する。エラーの原因と対策6選

スポンサーリンク




作業を自動化する
  • アレイのフィルター処理がエラーになる
  • エラーメッセージの意味がよくわからない
  • 思い通りフィルターされない

この記事では、そんな方に向けてアレイのフィルター処理がエラーになる原因と対策を6つ紹介します。

みずしぶき
みずしぶき

この記事を読めば、今起きているエラーを解決できます。
さらに自力で調査する方法も最後に紹介しています。

基本的な使い方についてはこちらを参考にしてください。

スポンサーリンク

失敗する原因と対策

アレイのフィルター処理は、多様なデータを処理するのでエラーになる頻度が高いアクションになります。
私が使っていてエラーになった内容を原因と対策でまとめました。

  1. 原因:タイプが違う
  2. 原因:item()がitems()になっている
  3. 原因:JSONのキー指定が誤っている
  4. 原因:差出人に配列以外を指定している
  5. 原因:Excelの日付がシリアル値になっている
  6. 原因:どうしてもわからない場合

6つ目は原因ではありませんが、原因がどうしても分からない場合の調べ方を紹介します。

公式の説明を見たい方はこちらを参照してください。

(1)原因:タイプが違う

100,200,300,400から200より大きな300と400を取り出したい場合。
この条件で実行してみると、

エラーになります。

InvalidTemplate. The execution of template action 'アレイのフィルター処理_2' failed: The evaluation of 'query' action 'where' expression '@greater(item(), 200)' failed: 'The template language function 'greater' expects two parameter of matching types. The function was invoked with values of type 'String' and 'Integer' that do not match.'.
テンプレートが無効です。テンプレート アクション 'アレイのフィルター処理_2' の実行に失敗しました: 'query' アクション 'where' 式 '@greater(item(), 200)' の評価に失敗しました: 'テンプレート言語関数 'greater' は、一致する型の 2 つのパラメーターを予期していました。この関数は、一致しない型「String」と「Integer」の値で呼び出されました。

エラー内容に書いてありますが、比較する2つのタイプが違います。

配列のデータがカンマで囲まれて文字になっているので、文字として認識されています。
比較する値は200の数値なのでタイプが違います。

  • createArray(‘100′,’200′,’300′,’400’)←文字になっているのでNG
  • createArray(100,200,300,400)←数値ならOK

アクションの動きです。
1つ目の比較でタイプが合わなかったのでエラーになりました。

item()>200結果
“100”>200ここでエラー
“200”>200
“300”>200
“400”>200

  対策:int関数で数値に変換する。int(item())

文字列の内容が数値だと分かっている場合はint関数を使って解決します。

  • 【修正前】item()
  • 【修正後】int(item())

修正後の条件がこちら

アクションの動きです。
200より大きい300と400がTrueになります。

int(item())>200結果
100>200False
200>200False
300>200True
400>200True

(2)原因:item()がitems()になっている

100,200,300,400から200より大きな300と400を取り出したい場合。
この条件で実行してみると、

エラーになります。

The template validation failed: 'The template action 'アレイのフィルター処理_4' at line '1' and column '2405' is not valid: "The template language function 'items' must have at least one parameter.".'.
テンプレートの検証に失敗しました: '行 '1' および列 '2405' のテンプレート アクション 'アレイのフィルター処理_4' は無効です: 「テンプレート言語関数 'items' には少なくとも 1 つのパラメーターが必要です。」 .'.

公式ではitem()関数で各項目にアクセスすると書かれています。items()ではないので注意しましょう。

パラメータに「アレイのフィルター処理_4」を入力しても、

使い方が違うのでエラーになります。

フローの保存がコード 'InvalidTemplate' およびメッセージ 'The template validation failed: 'The repetition action(s) 'アレイのフィルター処理処理_4' referenced by 'inputs' in action 'アレイのフィルター処理_4' are not defined in the template.'.' で失敗しました。

  対策:item()に直す

item()に修正しましょう。

  • 【修正前】items()
  • 【修正前】items(‘アレイのフィルター処理_4’)
  • 【修正後】item()

修正後の条件がこちら

(3)原因:JSONのキー指定が誤っている

100,200,300,400から200より大きな300と400を取り出したい場合。
この条件で実行してみると、

エラーになります。

InvalidTemplate. The execution of template action 'アレイのフィルター処理' failed: The evaluation of 'query' action 'where' expression '@greater(item(), 200)' failed: 'The template language function 'greater' expects all of its parameters to be either integer or decimal numbers. Found invalid parameter types: 'Object'.'.
テンプレートが無効です。テンプレート アクション 'アレイのフィルター処理' の実行に失敗しました: 'クエリ' アクション 'where' 式 '@greater(item(), 200)' の評価に失敗しました: 'テンプレート言語関数 'greater' はすべてのパラメーターを予期しています整数または 10 進数のいずれかになります。無効なパラメータ タイプが見つかりました: 'Object'.'。

これもタイプ違いのエラーになります。

アクションの動きです。
配列の中身が{}で囲まれたJSONのオブジェクトになっているので数値と比較できません。
JSONの場合はキーとなる文字を指定する必要があります。

item()>200結果
{“No”:100}>200ここでエラー
{“No”:200}>200
{“No”:300}>200
{“No”:400}>200

100,200,300,400の左側にあるNoがキーになります。

こちらはキーの名前を間違えたパターンです。

エラーになりました。

InvalidTemplate. The execution of template action 'アレイのフィルター処理' failed: The evaluation of 'query' action 'where' expression '@greater(item()?['Name'], 200)' failed: 'The template language function 'greater' expects all of its parameters to be either integer or decimal numbers. Found invalid parameter types: 'Null'.'.
テンプレートが無効です。テンプレート アクション 'アレイのフィルター処理' の実行に失敗しました: The Evaluation of 'query' action 'where' expression '@greater(item()?['Name'], 200)' failed: 'The template language function 'greeater ' expectedすべてのパラメータを整数または小数にします。無効なパラメーター タイプが見つかりました: 'Null'.'。

こちらも正解はNoを指定する事です。

  • キー:No
  • キー:Name←存在しないのでNG

アクションの動きです。
存在しないキーを指定しているので1つ目でエラーになります。

item()?[‘Name’]>200結果
>200ここでエラー
>200
>200
>200

  対策:キーを正しく指定する。item()?[‘No’]

配列がJSONオブジェクトの場合はキーを正しく指定しましょう。

  • 【修正前】item()?[‘Name’]
  • 【修正後】item()?[‘No’]

修正後の条件はこちら

アクションの動きです。
200より大きい300と400がTrueになります。

item()?[‘No’]>200結果
100>200False
200>200False
300>200True
400>200True

(4)原因:差出人に配列以外を指定している

この条件で実行してみると、

エラーになります。

BadRequest. The 'from' property value in the 'query' action inputs is of type 'Integer'. The value must be an array.
要求の形式が正しくありません。 'query' アクション入力の 'from' プロパティ値はタイプ 'Integer' です。値は配列でなければなりません。

配列以外を差出人に指定するとこのエラーになります。
int(‘100’)は数値型なので配列ではありません。

こちらはJSONオブジェクトを指定した場合です。

同じくエラーになります。

BadRequest. The 'from' property value in the 'query' action inputs is of type 'Object'. The value must be an array.
要求の形式が正しくありません。 'query' アクション入力の 'from' プロパティ値はタイプ 'Object' です。値は配列でなければなりません。

  対策:配列を指定する

アレイのフィルター処理なので配列を指定しましょう。

  • 【修正前】int(‘100’)
  • 【修正前】json(‘{“No”:100}’)
  • 【修正後】createArray(100,200,300,400)

修正後の条件がこちら

(5)原因:Excelの日付がシリアル値になっている

Excelのデータを取得した場合、Excelでは日付だったデータがPowerAutomateでは文字列のシリアル値になります。

この中から2022/08/26より後の日付を取得したい場合。
この条件で実行してみると、


エラーにはなりませんが、日付がシリアル値で全てTrueになってしまいました。

item()?[‘Date’]>“2022/08/26”結果
“44799”>“2022/08/26”True
“44800”>“2022/08/26”True
“44801”>“2022/08/26”True
“44802”>“2022/08/26”True

Excelの日付はシリアル値の文字列として取得されて、エラーにならないのが厄介です。

  対策:シリアル値を日付に変換する

Excelの日付を取得した場合は、シリアル値をyyyy/MM/dd形式に変換する式に書き換えます。

  • 【修正前】item()?[‘Date’]
  • 【修正後】addDays(‘1899/12/30’,int(item()?[‘Date’]),’yyyy/MM/dd’)

修正後の条件がこちら

アクションの動きです。
予定通り8/27〜8/29がTrueになりました。

addDays(‘1899/12/30’,int(item()?[‘Date’]),’yyyy/MM/dd’)>“2022/08/26”結果
“2022/08/26”>“2022/08/26”False
“2022/08/27”>“2022/08/26”True
“2022/08/28”>“2022/08/26”True
“2022/08/29”>“2022/08/26”True

(6)原因:どうしてもわからない場合

この中から2022/08/26より後の日付を取得したい場合。
この条件で実行してみると、

エラーになります。

InvalidTemplate. The execution of template action 'アレイのフィルター処理_5' failed: The evaluation of 'query' action 'where' expression '@greater(addDays('1899/12/30', int(item()?['Date']), 'yyyy/MM/dd'), '2022/08/26')' failed: 'The template language function 'int' was invoked with a parameter that is not valid. The value cannot be converted to the target type.'.
テンプレートが無効です。テンプレート アクション 'アレイのフィルター処理_5' の実行に失敗しました: 'query' アクション 'where' 式 '@greater(addDays('1899/12/30', int(item()?['Date' ]) , ' yyyy /MM/dd'), '2022/08/26')' が失敗しました: 'テンプレート言語関数 'int' が無効なパラメーターで呼び出されました。値をターゲット タイプに変換できません。

シリアル値を日付に変換する処理のint関数でエラーになっています。
Excelのデータを見てみるとNo3のDateがハイフンになっています。このハイフンは数字ではないのでここでint関数が失敗したようです。

アレイのフィルター処理でエラーが出た場合、1つのデータが原因でもどのデータか特定ができないという問題があります。
今回のようにデータが4つしか無ければ直接見て気づくかもしれないが、データが多いと探せません。

  対策:Apply to eachで調べる

アレイのフィルター処理が失敗しても、どのデータに問題があったか調べることができません。
Apply to eachなら問題のあるデータを調べることができます。

アクションApply to eachを追加して、その中にアレイのフィルター処理を入れます。

修正後の条件がこちら

items(‘apply_to_each’)のデータは配列ではないので差出人に設定するとエラーになりますが、array関数を使う事で配列として扱う事ができます。

【差出人へ追加】array(items(‘apply_to_each’))

この状態でフローを動かすと同じエラーが発生しました。

InvalidTemplate. The execution of template action 'アレイのフィルター処理_6' failed: The evaluation of 'query' action 'where' expression '@greater(addDays('1899/12/30', int(item()?['Date']), 'yyyy/MM/dd'), '2022/08/26')' failed: 'The template language function 'int' was invoked with a parameter that is not valid. The value cannot be converted to the target type.'.
テンプレートが無効です。テンプレート アクション 'アレイのフィルター処理_6' の実行に失敗しました: 'query' アクション 'where' 式 '@greater(addDays('1899/12/30', int(item()?['Date' ]) , ' yyyy /MM/dd'), '2022/08/26')' が失敗しました: 'テンプレート言語関数 'int' が無効なパラメーターで呼び出されました。値をターゲット タイプに変換できません。

今回はApply to eachで1つずつ処理しているので失敗したデータを調べることができます。
Apply to eachを開き「次の失敗」を押すとエラー部分が表示されました。

3つ目で止まっています。
後は、エラー文とデータを見比べればDateの値がシリアル日付ではなくハイフンだったのでint関数が失敗したことがわかります。

  補足:シリアル値に「ハイフン」が混ざっている場合の対処法2つ

1つめはExcelから取得するタイミングでフィルタークエリで取り除く

2つめはExcelから取得した直後にアレイのフィルター処理で取り除く

このようにフィルタークエリで絞っておいたり、アレイのフィルター処理を重ねる事で例外のデータを除外することができます。

まとめ

アレイのフィルター処理がエラーになる原因と対策を6つ説明しました。

  1. 原因:タイプが違う
  2. 原因:item()がitems()になっている
  3. 原因:JSONのキー指定が誤っている
  4. 原因:差出人に配列以外を指定している
  5. 原因:Excelの日付がシリアル値になっている
  6. 原因:どうしてもわからない場合

アレイのフィルター処理は「配列を指定する」「値のタイプを合わせる」JSONキーを指定するこの3つが基本になります。ExcelやSharePointのリストとも相性が良いのでエラーの傾向を覚えておきましょう。

PowerAutomateのおすすめ記事
人気ページ
Apply to eachの使い方
アレイのフィルター処理の使い方
日付関数の使い方
エラーを無視する方法
メールの内容をExcelへ転記
メール本文から名前を抽出

>>PowerAutomateの記事一覧を見る<<

お気に入り必須!公式ページ
Microsoft Power Automate
式関数のリファレンス
コネクタのリファレンス
Excel Online (Business)のリファレンス

最後まで読んで頂き、ありがとうございます。

「この記事が参考になった」「お礼でコーヒー代をプレゼントしよう」という方がいましたらチップ(15円〜)をお願いいたします。

Amazonギフト券- Eメールタイプ - Amazonベーシック

メールのあて先は 「mizusibuki8080@gmail.com」です。
※上記のアドレスは投げ銭受け取り専用です。他のメールは受け取れない設定にしてあるのでご注意ください。

作業を自動化する
ネットワークエンジニアになった人
タイトルとURLをコピーしました