rksoftware

Visual Studio とか C# とかが好きです

ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み込めません。

Visual Studio でいろいろしていると次のエラーが出ることがありました。

エラー    NU1301  ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み込めません。

ビルドやリビルドしても解消せず......。

■ 解消

ネットにつないだ状態でビルドしたら解消しました。

■ いかがでしたか

いかがでしたか?

MAUI デバッグ実行ができない

MAUI のプロジェクトを作って、ビルドに成功し、配置を単独で行うと配置できて、でもデバッグ実行できない場合、あると思います。
より正確にはデバッグ実行でビルドはされ成功するものの、配置がされずに終わってしまう。そんな状況です。

■ ソリューションの設定を見てみよう

そんなときはソリューションの設定を確認してみましょう。

Visual Studio のソリューション エクスプローラーの右クリックで開くコンテキスト メニューの一番下の プロパティ を選択。

ポップアップしたプロパティ設定での左ペインで 構成プロパティ構成 を選択。
右ペインで 配置 が OFF になっていたら ON (チェックをつける) に。

これでデバッグ実行できるようになりました。
と、これ書くの実は多分何度目かだと思います。

■ 忘れがちですね

忘れがちですね。

MAUI で DevDays ハンズオンをしてみたかった話

ようやく MAUI がリリースされました。Xamarin のサポート終了も予告され憂いなく MAUI に移行できるようになりました。
そこでこれからはコミュニティのイベントも MAUI を焦点に行っていくことになります。当然、Xamarin 時代に行っていたことも MAUI にアップデートしていかなければなりません。

■ 一番多くやってきたもの

正直一番多くやってきたのは Phoneword ハンズオンな気がします。
github.com

このコンテンツで入門者向けのイベントをよくやっていました。時期が経って新しいハンズオン素材が作られたのでその後は次のコンテンツをやり続けてきました。

github.com github.com

二つ貼っていますが、英語のコンテンツとそれを日本で行うために手順書を日本語にした公式のコンテンツです。そのほかにもハンズオン素材はいくつも作ってきましたが、一つを挙げるならばこれでしょう。

今日はこれを MAUI でやっていこうと思います。

■ 開発環境をアップデートする

MAUI はこれまでも何度か触ってきましたが、リリースに当たって開発環境もアップデートされています。まずは開発環境をアップデートしなければリリースされたバージョンで作れません。
開発環境としては正直、Visual Studio をアップデートすれば全部うまくいくはずです。それで事足りるのですが敢えて今回は maui-check というツールを使ってみます。これのツールは MAUI の開発環境が整っているかを確認し、整っていない部分を整えてくれるツールです。今の時代の開発環境はこういったツールで整えるのが一般的です。

正直、実はこのツールを使っても Visual Studio はアップデートすることになるのであまり意味はないのですが、将来 Visual Studio でなく Visual Studio Code で作れるようになる日が来ると思います。その時のために今から応援したいので愛用しています。

■ maui-check のアップデート

maui-check も MAUI とともにアップデートされているので、まずは maui-check をアップデートします。手順はアップデートが存在するかの確認から。maui-check は dotnet tool なのですが、dotnet tool は今のところ一括でインストール済みのツールのアップデートの存在確認を行ってくれる機能がないようです。そこでインストールされている dotnet tool のアップデートの存在確認を一括で行ってくれる dotnet tool の紹介です。

rksoftware.hatenablog.com

このツールで確認すると、アップデートがありました。インストールされているのが 0.10.0 で、現行バージョンは 1.0.0 と出ています。

> dotnettoolupdatecheck

Package ID                                      Current         Latest          Command
------------------------------------------------------------
redth.net.maui.check                            0.10.0          1.0.0           maui-check
rksoftware.dotnettoolupdatecheckerconsole       0.1.3           0.1.3           DotNetToolUpdateCheck
rksoftware.imageresizeconsole                   0.2.0           0.2.0           ImageResize
uno.check                                       1.4.2           1.5.4           uno-check

アップデートが見つかったのでアップデートします。方法はこちらに詳しいです。
rksoftware.hatenablog.com

> dotnet tool update -g redth.net.maui.check
ツール 'redth.net.maui.check' がバージョン '0.10.0' からバージョン '1.0.0' に正常に更新されました。

■ maui-check の実行

アップデートできたので maui-check していきます。

maui-check

Windows が立ち上がって環境を調べて結果を表示し、整えてくれます。

Visual Studio が古いと言われました。残念ながら Visual Studio の更新はツールでやってくれないので後で自分でアップデートします。


OpenJDK、AndroisSDK、Android エミュレーター、.NET のアップデートもしてくれます。


Workload がエラーになります。これはいつもエラーになりますね。



整えて、とお願いしても失敗しました。原因はわかりませんが私の環境ではいつもこうです。しかしいつも問題ないのでそのままにしてしまっています。

■ Visual Studio のアップデート

先ほど maui-check が整っていないと教えてくれた Visual Studio をアップデートしていきます。

Windows のスタートメニューで `visual studio installer をタイプしてインストーラーを起動。

私の環境では製品版とプレビュー版が入っています。これまで MAUI はプレビュー版でしたが、リリースされた今は製品版です。製品版をアップデートします。

今回は 5.6 GB ダウンロードするようです。私は個人の活動は優雅にカフェで作業しています。テザリングで。

デザリングで 5.6 GB というと少し抵抗のある方もあるかもしれません。しかし私には無限のギガがあります。どんな大容量ダウンロードも「まあ私には無限ギガあるしな」で OK です。都会の 5G 環境下では田舎の固定回線より早いかもしれません。それがこちらのプランです。よかったらぜひご検討してみてください。おすすめです。
www.docomo.ne.jp

5G の力で、ちょっと Twitter している体感すぐにアップデート完了。

■ もう一度 maui-check

もう一度 maui-check します。


Visual Studio、OK です。


5.0 が入っていて 5.0 でないからエラー? ひとまず y で整えてもらって......。

整った! けどワークロードはダメ。

maui-check では整わないようなので、Visual Studio の方でワークロードやコンポーネントを見てみましょう。インストーラーの [ 変更 ] で。


.NET マルチプラットフォーム アプリの UI 開発 を ON を → OFF → ON。


個別のコンポーネントも MAUI 関係を全部 ON を確認して [ 変更 ] 。

やっぱりだめ

しかし実はだめでも大丈夫なので、このまま進めていきます。

■ 小ネタ F# の場合

Xamarin でアプリを作る言語と言ったら何でしょう? そう F# です!

F# を指定して Visual Studio のプロジェクト テンプレートを検索すると......。
F# を選んでるのに C# しか出てきません。

Xamarin だと元気に F# もあります。

無念ですが C# で行くしかないようです。

■ プロジェクトの新規作成

というわけで普通に C# でプロジェクトを作成します。




つまるところなく出来上がりました!

■ Android エミュレーターの実行

普通に実行します。



実行できました!
Visual Studio のデバッグ実行をするだけでもエミュレーターの起動 → デバッグ実行の開始、と動作しますが結構時間がかかります。時間がかかるタスクは分解していた方が、ちゃんと動いてるかな? と不安になりにくいのでお勧めです。

■ デバッグ実行

まずはそのまま。素材の味を楽しむために一切の編集無しにデバッグ実行してみます。



動きました! テンプレートで新規作成してそのままデバッグ実行できるのはすばらしいですね! すばらしいですね!

■ 余談 Xamarin の場合

Xamarin の場合どんな感じか見てみましょう。
プロジェクト テンプレートから選択すればよいのですが、実は Xamarin が入っていない Visual Studio でもプロジェクトテンプレートに出てきたりします。

Xamarin を追加します。

プロジェクト テンプレートから選択して進めてみます。ここで、Xamarin.Forms ではなく Xamarin が選択できていることに注目してください!
MAUI は Xamarin.Forms の進化です。今のところ Xamarin に相当するもの ( Xamarin.Forms を使わない純粋な Xamarin ) は MAUI 世代では 作れないのかもしれません。




できました!

そのまま実行も OK です。すばらしいですね。

ここで、MAUI のデフォルトと比較してみましょう。だいぶリッチになっていますね。

■ DavDays ハンズオンの今

ようやく本題に入って DavDays ハンズオンの話が始められます。

DevDays ハンズオンは半完成品からの作業という特徴があります。その特徴が後々厳しいことになるのですが実はそんなことは大したことではありません。
まずは日本語コンテンツを見てみましょう。 github.com

半完成コードをダウンロードして始めることが書いてあります。

次に半完成コードをダウンロードする本家英語コンテンツがこちらです。
github.com

この二つのコンテンツがあることが大きな問題になります。そのコンテンツの最終変更日を比較します。

おわかりいただけただろうか?

コンテンツ 更新日
日本語 2018/09/12
本家英語 2019/12/15

1 年と 3 か月も日本向けに用意されていたコンテンツが整備されていないことが分かりました。この日本語コンテンツのメンテナンスが行われていない間に本家英語のコンテンツが大きくつくりかえられており、日本語のテキストは全く実体と違ってしまっています。

結論その 1

何度もお世話になってきた日本語コンテンツですが、日本語テキストは古いので英語の本家でやっていきましょう。偉い人などに MAUI を推す際には英語本家のリポジトリを伝えるのが良いと思います。大丈夫。今のご時世なら「公式情報は英語が基本です」で納得いただけるでしょう。

■ 本家英語コンテンツでやっていく

まずはソースをダウンロードします。

3 年前のコンテンツだが、開いてビルド実行できます。素晴らしい。 ( ※ Xamarin の開発環境が必要です。 )

■ フォルダ構成

このダウンロードしたソースは Xamarin のプロジェクトなので、クラスファイルなどを MAUI で新規作成したプロジェクトに順次移さなければなりません。その際、Xamarin と MAUI でフォルダー構成が異なっている点をしなければなりません。
( ※ この辺りで入門用としては使えない事実から逃れられません。もしこのコンテンツで MAUI を学習できる世界が欲しければ、我々で MAUI 用に移植をする必要があるでしょう )

Xamarin で作れている半完成コードのフォルダ構成

MAUI で新規作成したプロジェクトのフォルダ構成

■ Speaker クラス

ハンズオン手順で最初に出てくるのが Model クラスの Common/DevDaysSpeakers.Shared/Models/Speaker.cs です。

これは MAUI では クラスライブラリプロジェクト Shared を作って ../Shared/Models/Speaker.cs とするが良いと思います。

ここで、なぜ日本でハンズオンが行われていた時にはなかった共有プロジェクトがあるかというと、Azure Functions を使うように変更されているからです。Azure Functions とモデルを共有できることを示すためでしょう。

その他同じように読み替えるクラス

Xamarin MAUI
Common/DevDaysSpeakers.Shared/Models/Speaker.cs ../Shared/Models/Speaker.cs
Mobile/DevDaysSpeakers/ViewModels/SpeakersViewModel.cs ViewModels/SpeakersViewModel.cs
Mobile/DevDaysSpeakers/Views/SpeakersPage.cs Views/SpeakersPage.cs
Mobile/DevDaysSpeakers/Views/SpeakersCell.cs Views/SpeakersCell.cs
Mobile/DevDaysSpeakers/Views/DetailsPage.cs Views/DetailsPage.cs
Mobile > DevDaysSpeakers > Services > AzureService.cs Services/AzureService.cs

ただソースコードファイルを持ってくるだけだと、ファイルのフォルダパスと namespace が対応しなくなりますが大丈夫です。そのままで行ける。コピーしてきたコードと新しく作った別のクラスなどで整合性が取れていなくなることもありますが、そこはアドリブできる力があれば雑にやって大丈夫です。概ね Visual Studio の「 ctrl + .」での修正機能を使えばうまくできるでしょう。

■ Azure Functions 関連

コンテンツの手順では Azure Functions も作り、Xamarin からそれを呼び出すというものになっていました。Xamarin と Azure の連携を体験して欲しかったのだと思います。
しかし今回は Xamarin → MAUI が目的なので Azure Functions は作らない方向で行きたいと思います。作らなくても大丈夫なので。

なぜ作らなくて大丈夫かというと、デモ用の Azure Functions が未だに活きているようだからです。実は半完成コードをダウンロードした際にフォルダが分かれて完成コードも .zip に含まれています。 Finish というフォルダの中です。この中に書かれている URL がデモ用なようでいまだに動作しているようです。Finish の中から URL を取り出して使いましょう。

■ namespace や using

もともと半完成コードに namespace や using が既に書かれているため、手順のテキストでは namespace や using に触れられていないクラスの編集手順があります。それらは半完成コードからアドリブでコピーして持ってくる必要があります。
その際、その時点で手順に出てこないファイル ( もとでは半完成のため存在するが MAUI では自分で作らなければならない。まだ作っていない ) の namespace が using されていることがあるので一時的にコメントにしておく等も必要になります。

■ NuGet パッケージ

もともとのコードでは Json.NET ( Newtonsoft.Json ) が使われています。以前はほぼ基本ライブラリ扱いのパッケージでどんなアプリでも使っていたライブラリです。しかし現在の .NET ではその地位を別のものに譲っていて新規作成した MAUI プロジェクトではインストールされていません。MAUI プロジェクトでは手動で nuget から追加が必要になります。

■ Xamarin.Forms の参照

もともとのコードでは当然ですが Xamarin.Forms を使っているので、何か所かで using されています。この using は消す必要があります。

using  Xamarin.Forms;

もコメントにします。

ここで、この using を消すだけで良いというところが大きなポイントです。Xamarin.Forms と MAUI のコントロールは namespace の違いだけでクラス名が同じものが大半だという点です。これは移行が捗る要因です。

■ nullable の警告

nullable の警告が出る場所があります。これは .NET の世代が上がったことでプロジェクトのデフォルト設定が変わったためです。警告なので無視可能です。今回は無視します。

■ ページ

ページも自分で作らなければなりません。ここで嬉しいのが、コードで画面を作るようになっている部分です。xaml を使っていないということです。つまりコードを半完成コードから MAUI に持ってくるのが楽です。MAUI でもコードで UI を作ることは Xamarin.Forms のころと変わらず可能です。
ページをプロジェクトに追加するのも簡単。

■ クラスのフィールド

クラスのフィールドがすでにか書かれていて手順に出てこないことがあります。これも半完成コードからコピペして持ってくる案件です。

■ クラスの出てくる順番

手順で出てくるたびにクラスを作っていくと途中でコンパイルが通らない場面が出てきます。後方の手順で出てくるクラスがコードに出てくることがあるためです。
半完成コードだとすべてのクラスが最初からコード上に存在していますが、MAUI で新規に作ったプロジェクトには自分で作らなければ存在しません。手順を先回りしてクラスを作らないとコンパイルが通らないタイミングが出てきます。
うまく把握して半完成コードから都度コピペで持ってくる案件です。

■ global using

前述の using Xamarin.Forms; を消すだけで MAUI のコントロールが使える理由ですが、これは MAUI のプロジェクトでは global using という機能が使われるためです。この global using とは、一か所で using を書くだけですべての C# ソースコードファイルで using したものと同じ状態になるという素敵機能です。

Xamarin.Forms.ImageCell というコントロールクラスを使う場面で using Xamarin.Forms; がされていてコンパイルがエラーとなる場面が出てきます。MAUI では Microsoft.Maui.Controls.ImageCell なので本当は using Microsoft.Maui.Controls; が必要なはずですが MAUI プロジェクトでは不要です。
MAUI プロジェクトでは次の global using のコードが自動生成され有効になります。

global using global::Microsoft.Extensions.DependencyInjection;
global using global::Microsoft.Maui;
global using global::Microsoft.Maui.Accessibility;
global using global::Microsoft.Maui.ApplicationModel;
global using global::Microsoft.Maui.ApplicationModel.Communication;
global using global::Microsoft.Maui.ApplicationModel.DataTransfer;
global using global::Microsoft.Maui.Authentication;
global using global::Microsoft.Maui.Controls;
global using global::Microsoft.Maui.Controls.Hosting;
global using global::Microsoft.Maui.Controls.Xaml;
global using global::Microsoft.Maui.Devices;
global using global::Microsoft.Maui.Devices.Sensors;
global using global::Microsoft.Maui.Dispatching;
global using global::Microsoft.Maui.Graphics;
global using global::Microsoft.Maui.Hosting;
global using global::Microsoft.Maui.Media;
global using global::Microsoft.Maui.Networking;
global using global::Microsoft.Maui.Storage;
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

■ namespace だけではない変更 Color クラス

ハンズオンのコードに Xamarin.Forms.Color 構造体が出てきます。これは、Microsoft.Maui.Graphics.Color クラスと Microsoft.Maui.Graphics.Colors クラスになりました。
これは納得の変更で、MAUI への移行に際ししっかりと検討され適切な変更がされているとこが分かります。色を表すクラスと、決まった色のインスタンスをフィールドに持つクラスに整理されています。

その結果ハンズオンのコードで出てくる Color.TransparentColors.Transparent と書き換える必要があります。少し分かりにくいので縦に並べておきます。
Color.Transparent
Colors.Transparent

■ スタートアップページを変更

これはかなり難易度の高いアドリブです。MAUI プロジェクトテンプレートからのプロジェクトの新規作成でスタートアップのページが作られていますが、半完成コードのページに変更する必要があります。
プロジェクトの新規作成時に作られたページに半完成コードをマージしても良いでしょうが、それはそれできちんと理解してのアドリブが必要です。 どうせアドリブするならきれいにコピペできるスタートアップページの変更で対処するのが良いと思います。MAUI でのスタートアップページ変更も学べますし。

AppShell.xaml ファイルを編集します。

編集前

<?xml version="1.0" encoding="UTF-8" ?>
<Shell
    x:Class="MauiAppDevDays1.AppShell"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:MauiAppDevDays1"
    Shell.FlyoutBehavior="Disabled">

    <ShellContent
        Title="Home"
        ContentTemplate="{DataTemplate local:MainPage}"
        Route="MainPage" />

</Shell>

編集後

<?xml version="1.0" encoding="UTF-8" ?>
<Shell
    x:Class="MauiAppDevDays1.AppShell"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:MauiAppDevDays1.Vews"
    Shell.FlyoutBehavior="Disabled">

    <ShellContent
        Title="Home"
        ContentTemplate="{DataTemplate local:SpeakersPage}"
        Route="MainPage" />

</Shell>

編集個所を分かりやすいように縦に並べておきます。
ContentTemplate="{DataTemplate local:MainPage}"
ContentTemplate="{DataTemplate local:SpeakersPage}"

■ avatar のリンク切れ

これはコードの問題ではないので、対処がないです。ハンズオンで作るリスト画面で各要素ごとにアバター画像が表示されるはずの部分があります。
このアバター画像がリンク切れになっています。デモデータの問題です。正直賞味期限切れのコンテンツなのでリストのデータが生きていただけでもありがたいところです。ここはこれまで学習させてくれたことに感謝をしつつ受け入れるしかありません。


■ しゃべってくれない

これは解決できませんでした。Xamarin のコードでもしゃべってくれませんでした。

こんなエラー

ここの 「 Speak 」 でエラーになります。

System.ArgumentException: 'Failed to initialize Text to Speech engine.'

このエラー、ネットの情報で AndroidManifest.xml に記述の追加が必要というものが多く見つかりますが、解決できませんでした。

デフォルトの AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

追加する記述

    <queries>
        <intent>
            <action android:name="android.intent.action.TTS_SERVICE" />
        </intent>
    </queries>

記述追加後の AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
  <queries>
    <intent>
      <action android:name="android.intent.action.TTS_SERVICE" />
    </intent>
  </queries>
</manifest>

結論その 2

Microsoft Learn を使え。

docs が learn にドメイン変更になって公式情報として docs の URL を記載した情報の更新に皆様頭を悩ませている昨今ですが、以前からの Learn のコンテンツのことです。ここに MAUI の学習ラーニング パスがあります。
Learn は非常に公式で推されているコンテンツですので、MAUI の学習コンテンツもここが注力の場であることは想像に難くありません。実際、MAUI のコンテンツがちゃんとあります。

docs.microsoft.com

ここで、この画面、Microsoft による Xamarin 買収前後以前に何やら見覚えがある気がします。その見覚えは何でしょう? そう、このハンズオンです。
github.com

歴史と伝統のコンテンツです。DevDays ハンズオンでなくこちらが Learn の題材になっています。これは見ようによっては MAUI 採用時に偉い人に説明しやすい状況です。

「Microsoft が Xamrin を始めたころの入門コンテンツが未だに入門コンテンツとして生きている安定性」

とアッピールするといいと思います。偉い人は Write once, run forever. が大好きです。

簡単ですね

MAUI 入門、簡単ですね。

VRChat でワールドに入れなくなった → 解決

ある日、何もしてないのに久しぶりに VRChat を起動してワールドに入れなくなりました。
VRChat は詳しくないのでワールドに入れないという表現で伝わるのか自身がありませんが......。

ワールドに入れない

Home から歩いて門? をくぐってワールドに入る → ×。
フレンドのいるワールドに Join → ×。
Invite → ×。

といった感じ。どれをどうしようと Home のスポーン地点に移動してしまう状況でした。
PC の再起動やクライアントアプリの再起動など試すも効果なし......。

ネット検索するも対策は見つけられずその日はあきらめました。

解決

1 週間後、VRChat を起動してみると普通にワールドに入れました。

1 週間、PC はスリープ運用で再起動無し。クライアントアプリの再インストールなども無しです。
そう。何もしてないのに治った、です。(そういう意味なら入れなかった時も何もしてないのに壊れた、です)

謎です。日が経てば治るというのは知見ですが、今日入りたい! というときには無力です。

まとめ

VRChat でワールドに入れなくなった事象について、解消したものの何がどういうことなのかよくわかりませんでした。
いかがでしたか?

Power Automate で配列から空白の要素を取り除きたい

Power Automatede で文字列の配列から空白の要素を取り除いた配列が欲しい。そう思っていますね? 大丈夫です。私もそう思っています。

■ 要件

例えばこんなデータがあったとします。

["001", "", "003"]

空白の要素を取り除いたこんな配列が欲しい!

["001", "003"]

■ アレイのフィルター処理

アレイのフィルター処理 を使います。データ操作の アレイのフィルター処理 を選択。

こんな感じに設定します。

やっていることは、 作成 でデータを作って

["001", "", "003"]

アレイのフィルター処理差出人 ? に 作成出力 を設定。条件に要素が空白でないことを設定していし ます。

出力 のコード

@outputs('作成')

条件

length(trim(string(item()))) 次の値より大きい 0

関連情報

rksoftware.hatenablog.com

最後に アレイのフィルター処理 の結果を使う例として 作成 2 を追加しています。

入力 のコード

@{body('アレイのフィルター処理')}

実行結果

計画通り! 空白の要素を取り除いた配列が得られました。

■ 簡単ですね

簡単ですね。

関連記事

rksoftware.hatenablog.com

Power Automate で配列から条件に合ったデータを抜き出して値を加工した配列を作りたい (LINQ の Where Select のようなことをしたい)

Power Automatede で C# の LINQ の Where Select のようなことをしたい。そう思っていますね? 大丈夫です。私もそう思っています。

■ 要件

例えばこんなデータがあったとします。

[
 {"A": "" , "B": "001"},
 {"A": "1", "B": "002"},
 {"A": "2", "B": "003"}
]

それをこんなデータに変換したい。頻出する要件ですよね。

["001", "003"]

こんなデータに変換するパターンも。

[
 {"A2": "1", "B2": "002"},
 {"A2": "2", "B2": "003"}
]

C# では LINQ の Where と Select で良く実現するやつです。

■ Power Automate

Power Automate でも非常に分かりにくいですが実現できます。わかりにくいのはアクションの設定 UI なので、わかってしまえば簡単です。
※関数にあってくれるととても扱いやすくていいのですが、今回見つけた手法はアクションです。

Where はデータ操作の アレイのフィルター処理 、Select はデータ操作の 選択 を使います。

この 選択 ですが、内部名は select っぽいですね。設定 UI の 開始 も良くわかりませんが、内部だと from っぽい? select と from と書いてくれるととても簡単だと思うのですが敢えてラベル名を変えているので色々検証してこれがよいということなのでしょう。マップは確かに select よりも適切です。



※コードを確認すると、from と select。わかりやすいです。

■ アレイのフィルター処理 ( Where に相当する機能 )

アレイのフィルター処理 を作っていきます。まずはデータ操作の アレイのフィルター処理 を選択。

こんな感じで設定します。

やっていることは、 作成 でデータを作って

[
 {"A": "" , "B": "001"},
 {"A": "1", "B": "002"},
 {"A": "2", "B": "003"}
]

アレイのフィルター処理差出人 ? に 作成出力 を設定。条件にプロパティ A が空白でないことを設定していし ます。

出力 のコード

@outputs('作成')

条件

length(trim(string(item()?['A']))) 次の値より大きい 0

関連情報

rksoftware.hatenablog.com

■ 選択 ( Select に相当する機能 )

続いて 選択 を作っていきます。まずはデータ操作の 選択 を選択。

で、設定 UI はこんな感じです。何をどう設定するか一見難しいですが、このモードを使う必要はないので忘れていいです。右端の マップ をテキストモードに切り替える をクリックすれば OK です。

こんな UI に変わります。シンプル。わかりやすい。

こんな感じに設定します。

やっていることは、 開始 (コードとしては from) に アレイのフィルター処理 の結果を設定して

@{body('アレイのフィルター処理')}

マップ (コードとしては select) に要素ごとのデータのパスを設定しています。要素ごとに、この式の結果が値となります。

item()?['A']

■ 実行

実行するとこんな感じです。

計画通り! 欲しかった値を作ることができました。

選択 の真の力

選択 の真の力はこんなものではありません。C# の LINQ の Select で匿名のオブジェクトへの変換をするのと同じことができます。むしろこちらが本当の力です。
選択 の最初の UI はこの力を発揮するためのものですが、難しいので UI のモードを変えて JSON を書く方が分かりやすいです。

こんな感じです。

{
  "A2": "@{item()?['A']}",
  "B2": "@{item()?['B']}"
}

実行結果

計画通り! 要件通りの値が得られました。

■ 簡単ですね

簡単ですね。

関連記事

rksoftware.hatenablog.com

Power Automate のエラー処理 (例外処理) (try { } catch { } finally { }) でエラーの内容を取得する

Power Automate のエラー処理 (例外処理) でエラーの内容を取得する方法です。

まず、エラーをテストするのに手っ取り早い方法とエラー内容の取得は以前に書きました。
rksoftware.hatenablog.com

try { } catch { } finally { } ぽいことを実現する方法も書きました。
rksoftware.hatenablog.com

エラー時にエラー時の状況が確認できる実行履歴詳細ページへのリンク URL を作る方法も書きました。
rksoftware.hatenablog.com

これらを組み合わせていい感じのエラー処理 (例外処理) を作ります。

■ 実行条件の設置

スコープを 3 つ並べて実行条件の構成を次のようにします。

実行条件の構成の開き方

構成の設定

■ エラーを起こすアクション

try { } に相当するエラーが起こるかもしれない処理を書くスコープ スコープ (try { } に相当) にエラーを起こすアクションを追加します。

エラーを起こすには次のような式を書くのが手っ取り早いです。

mod(1, 0)

実行すると期待通りエラーが起きてくれます。

■ エラー処理内でエラー内容の取得と実行履歴の URL を生成

スコープ_(try_{_}_に相当) はエラーが起こるかもしれない処理の名前です。皆さんの作っているフローに合わせて読み替えてください。式の中で書く名前は名前に含まれているスペースは _ に置き換わる点に注意してください。

エラー時に取得できると嬉しそうな各種情報は次の式で取得できます。

取得する情報 取得する式
エラーの起きたアクションの名前 result('スコープ_(try_{_}_に相当)')[0]?['name']
エラーの概要 result('スコープ_(try_{_}_に相当)')[0]?['error/code']
エラーの内容 result('スコープ_(try_{_}_に相当)')[0]?['error/message']
フローの名前 workflow()?['tags/flowDisplayName']
フローの作られている環境の ID workflow()['tags']['environmentName']
フローの ID workflow()['name']
フローの実行 ID workflow()['run/name']

また、これらの情報を使ってフローの詳細ページや実行履歴詳細ページの URL を生成することもできます。実行履歴詳細ページの URL がわかると詳細をすぐに確認できるのでエラー時の対処に非常に有用でしょう。

詳細ページの URL

https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/details

実行履歴詳細ページの URL

https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/runs/@{workflow()['run/name']}

これらの情報をメールなどで自分に送信するようにしておくととても良いと思います。

■ 実行結果

今回は画像で見やすいよう前述の情報を持った JSON 作って確認します。

スコープ (catch { } に相当) の中で JSON の解析 アクションにこんな設定をします。

{
  "errorAction": "@{result('スコープ_(try_{_}_に相当)')[0]?['name']}",
  "errorCode": "@{result('スコープ_(try_{_}_に相当)')[0]?['error/code']}",
  "errorMessage": "@{result('スコープ_(try_{_}_に相当)')[0]?['error/message']}",
  "フローの名前": "@{workflow()?['tags/flowDisplayName']}",
  "フローの詳細画面の URL": "https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/details",
  "フローの実行履歴詳細の URL": "https://make.powerautomate.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/runs/@{workflow()['run/name']}"
}

実行

計画通り! エラーが発生して各種情報が取得できています。finally に相当するスコープも動作しています。

ちなみにこの縦長画像を作った技はこちらです。

rksoftware.hatenablog.com

URL を開いた結果

実行結果で得られた 2 つの URL を開いてみます。

詳細ページの URL

実行履歴詳細ページの URL

エラー時の情報としてかなりいいのではないでしょうか?

■ 簡単ですね

簡単ですね。