くらっちのクラウド日記

仕事や勉強で得た Microsoft 365 関連の技術知識を投稿していくブログです。

【PowerAutomate】「型名のないエントリが見つかりましたが、必要な型が指定されませんでした。」を解決する。

はじめに

「型名のないエントリが見つかりましたが、必要な型が指定されませんでした。型情報を持たないエントリを受け入れるには、モデルを指定するときに、必要な型も指定する必要があります。」
PowerAutomate でこんなエラーが出たとき、解決に苦労しました。

今回は、このエラーを解決するための対処方法2点をご紹介します。

目次

筆者が直面した状況

SharePoint の「ドキュメント(Shared Documents)」ライブラリにファイルが作成された時にファイル名を変更する。
というフローを作成していた時に表題のエラーが発生しました。

エラーが発生したのは「SharePoint に HTTP 要求を送信します」アクションです。
気を付けなければいけないのは、下図赤枠内の2カ所です。

原因その1:type が間違っている

上図の「SharePoint に HTTP 要求を送信します(リネーム)」アクションでボディにPOSTする対象を type で指定しています。
指定する際は下記に従って記入してください。
指定するのが「表示名」ではなく「内部名」である点に注意してください。

構文
"type": "SP.Data.リスト内部名Item"

例1  ドキュメント(Shared Documents)の場合
”type”: "SP.Data.Shared_x0020_DocumentsItem"

原因その2:metadata の記述が間違っている

上図の「SharePoint に HTTP 要求を送信します(リネーム)」アクションでボディの type を囲む metadata ですが、よく見ると先頭に「__(アンダーバー)」が含まれています。

しかも、アンダーバーは半角1文字でも全角1文字でもなく、「半角2文字」ですのでご注意ください。
アンダーバー1文字の _metadata だと表題のエラーが発生します。

 "__metadata": 

結論

例のように、ファイル名のリネームを行いたい場合は下記コードを参考にして ボディを作成してください。

{
    "__metadata": {
        "type": "SP.Data.Shared_x0020_DocumentsItem"
    },
    "FileLeafRef": "新しいファイル名"
}

【PowerApps】複数選択したユーザーをJSON関数でPowerAutomateに渡す

はじめに

※この記事は、情報を最新化しつつ Qiita から移行してきたものになります。

今回は、PowerApps で複数選択したユーザーを PowerAutomate に渡す方法をご紹介します。

コンボボックスなどで複数選択した値やテーブル値を、単純に PowerApps から PowerAutomate に渡しても、すべてのデータを受け取ることはできません。
では、どうしたらよいのでしょうか。

結論、複数選択した値を PowerApps から PowerAutomate へ渡す場合は PowerApps 上でJSON関数を用いてJSON形式にしましょう。

目次

PowerAutomate側の構築

まずは PowerAutomate 側でJSONを受け取る準備をします。

全体構成

説明用にシンプルなフローを作成しました。
下図のフローでは、
・PowerApps から受け取った JSON を解析(データの抽出)
・解析した結果を保管する変数を用意
・データ数分、処理を繰り返します。

順番に各アクションの中身を見ていきましょう。

JSONの解析

JSONの解析」アクションで、PowerApps から受け取ったデータ(JSON)を後続の処理で利用できるようにします。

コンテンツには「PowerAppsで確認」をクリックしてJSONの解析_コンテンツ」を配置します。

スキーマにはユーザー情報を取得するため、下記コードをコピペしてください。

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "Claims": {
                "type": "string"
            }
        },
        "required": [
            "Claims"
        ]
    }
}

変数を初期化する

後続の「Apply to each」で利用する変数「username」を用意します。

Apply to each (変数の設定)

「以前の手順から出力を選択」で、「JSONの解析」-「本文」を選択します。
「変数の設定」には、JSONから受け取った「Claims」を挿入します。

ここまでできたら、PowerAutomate 側の設定は完了です。
次はPowerAppsの設定です。

PowerApps側の構築

PowerApps側の画面構成は下図の通り。
UserNameでユーザーを複数選択して実行ボタンをクリックするとJSON形式のデータがPowerAutomate側に渡されます。

利用しているコネクタは下記の2つ。

コネクタ 用途
PowerApps 実行ボタンクリックで PowerAutomate フローを起動。
SharePoint ユーザー列を含むリストです。

ユーザーを複数選択するために

PowerAppsでユーザー選択を可能にするために一番簡単な方法は、SharePointリストのユーザー列を追加することです。
今回は事前にSharePointリスト(JSONチェック リスト)を用意して、Form1として追加しました。
Form1内の「UserName_DataCard1」が複数選択可能なユーザー列です。
DataCard内のコンボボックス(図のDataCardValue2)の設定「複数選択の許可」がオンになっていることを確認してください。

この UserName_DataCard1 でユーザーを複数選択可能にしただけでは、PowerAutomate側にJSON形式でデータを渡すことはできません。
重要なのは、実行ボタンクリック時の処理です。

JSON関数を利用する

「実行ボタン」の「OnSelect」に下記のコードを入力します。

Set(jsonApprover,JSON(DataCardValue2.SelectedItems.Claims,IndentFour));
PowerAutomateのフロー名.Run(jsonApprover);

1行目でUserNameで選択したユーザーをJSON形式に変換しています。
この時「DataCardValue2.SelectedItems.Claims」を指定していますね。
PowerAutomate側でも「JSONの解析」アクションなどで「Claims」という単語が使われていました。
PowerApps側からJSON形式で「Claims」を受け取ったため、PowerAutomate側で同じ名前を指定することでデータを処理できるようになったのです。

JSONに変換されたデータは、2行目の「PowerAutomateのフロー名.Run()」でPowerAutomate側へ渡されます。

JSON関数について

JSON関数の構文は以下の通りです。

JSON(DataStructure [, Format ] )

DataStructureは、テーブル名を入力。
 ※複数選択可能なコンボボックスなどもテーブルとして扱われます。
Formatは、ユーザー情報を使用する場合「IndentFour」を使用。

具体的には以下のように使用します。

JSON(DataCardValue2.SelectedItems.Claims,IndentFour)

JSON関数に関するMicrosoft公式情報はコチラから

実行結果

PowerAppsアプリを実行すると下図の通りユーザー情報を受信できました。

JSONの解析」で出力される値:
PowerAppsから受け取ったユーザー情報が Claims に入っています。

「変数の設定」で出力される値:
JSONの解析」で出力されたデータ分、変数「username」に Claims のデータが入っています。

これで完成です!!

JSONは慣れるまで扱いが難しいですが、理解できればすごく有効な方法です。
JSON関数は幅広く活用できるものだと思いますので、色々チャレンジして使ってみるといいかもですね。

【PowerApps】コンボボックスで複数選択した値を PowerAutomate で利用する

はじめに

※この記事は、情報を最新化しつつ Qiita から移行してきたものになります。

PowerApps のコンボボックスは、既定の動作として複数選択した内の「最後の選択肢」のみを PowerAutomate に渡します。
複数選択した値全てを PowerAutomate で使いたい場合これでは困りますよね。

今回紹介するのは、PowerApps の「コンボボックス」で複数選択した値をすべて PowerAutomate に渡して利用するための方法です。

目次

PowerApps 画面構成

今回は下記の操作を想定したアプリを作成して説明を行います。
 1.コンボボックスで「好きな食べ物」を複数選択する。
 2.送信ボタンをクリック。
 3.送信ボタンクリックをトリガーに PowerAutomate が起動する。

サンプルアプリの画面構成は下図の通りです。

PowerAutomate 構成

PowerAutomate の構成は下図の通りです。
最低限必要なのは PowerApps トリガーと「JSONの解析」アクションです。

実装方法

1.PowerAutomate:「JSONの解析」を追加する

今回のアプリは、コンボボックスで複数選択した値をJSON形式でPowerAutomate に渡します。
PowerAutomate では、PowerApps から受け取った JSON を解析し、データを分割して使えるようにします。
イメージにするとこんな感じ。

上図右側を見ると「Value」という変数にデータが入っているのが分かります。
このValueを受け取るためには下記スキーマが必要です。
詳細は後ほど説明します。

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "Value": {
                "type": "string"
            }
        },
        "required": [
            "Value"
        ]
    }
}

2.PowerApps:コンボボックスを複数選択可能にする

サンプルでは下記のパーツを配置しました。

ComboBox1 のプロパティ「複数選択の許可」を「オン」にします。

3.PowerApps:ボタンクリックでPowerAutomateのフローを実行する

ComboBox1 で複数選択した値をすべて PowerAutomate に渡すために、JSON 関数 を利用します。
Button1 の OnClick に下記コードを記入します。

Set(jsonValue,JSON(ComboBox1.SelectedItems.Value,IndentFour));
作成したフロー名.Run(jsonValue);

上記、JSON関数内の「ComboBox1.SelectedItems.Value」は、ComboBox1で選択した値全てを含むテーブルです。

実はコンボボックスってデータ型は「テーブル」なんですね。

JSON関数はテーブルやレコードをJSON形式に変換します。
JSON形式に変換されたデータは「フロー名.Run( )」でPowerAutomateに渡します。

PowerAutomate側では、JSON形式に変換された「ComboBox1.SelectedItems.Value」を受け取ります。
JSONの解析」に記載の「required」で「Value」を指定することで「ComboBox1.SelectedItems.Value」テーブルのデータを扱うことができるようになるのです。

スキーマの記述例はこちら。

{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "Value": {
                "type": "string"
            }
        },
        "required": [
            "Value"
        ]
    }
}


実行結果がこちら。

うまくコンボボックスで選択した値が取得できていますね。
あとは、PowerAutomate の後続の処理で煮るなり焼くなり好きに調理しましょう!!

少しでも皆様のお役に立てば嬉しいです。

【Teams】トランスクリプト機能のあれこれ

Teams会議の会話内容を文字起こしする「トランスクリプト機能」についてまとめました。
これから機能を使おうと思っている方の参考になればうれしいです!!

目次

トランスクリプト機能とは

・Teams会議において参加者の発言を 文字起こし する機能。
・日本語による文字起こしが可能。
・文字起こし結果は既定で「120日間」保管されます。
・保管期間は「1~99999日」の範囲で変更可能。
・文字起こし結果は、Wordファイル / vttファイルとしてダウンロード可能。
・ダウンロードファイルには「発言者名、発言時間、発言内容」が記録されます。
・文字起こし開始時、会議参加者には記録中である旨の通知が画面に表示されます。

注意事項

・日本語の文字起こし精度は高くありません。※メモ程度に考えるのが最良。
・トランスクリプト機能は文字記録のみで、音声は記録されません。
・トランスクリプト機能は翻訳は行いません。
・文字起こし結果は、ダウンロードするまでテキスト編集できません。
・複数人が同時に発言した場合、1人分しか文字化できません。

必要な事前設定

予定された会議 / チーム会議 の場合

予定された会議 or チーム会議で機能を使用する場合は下記設定をオンにします。
グループチャットでトランスクリプト機能を利用する場合も、下記設定をオンにすることで可能になります。通話ポリシー関係ないらしくすごい不思議。。

1.Teams管理センター > 会議 > 会議ポリシー をクリック
2.レコーディングとトランスクリプト > トランスクリプト をオンにする

個人チャットで通話する 場合

トランスクリプト機能を個人チャットで通話する際に使用する場合は下記設定をオンにします。

1.Teams管理センター > 会議 > 通話ポリシー をクリック
2.トランスクリプト をオンにする

利用可能なユーザー

トランスクリプト機能を利用できるユーザーと利用可能な範囲は下表の通りです。

利用可能なユーザー

以下ライセンスを持っているユーザーはトランスクリプト機能を利用できます。
・O365 E1、M365 E3、M365 E5、
・O365 A1、O365/M365 A3、O365/M365 A5、
・M365 F1、O365/M365 F3、
・M365 Business Basic、M365 Business Standard、M365 Business Premium SKU

利用可能な操作

トランスクリプト機能で利用できる範囲は下表の通りです。

文字データの保存場所とダウンロード

文字データは ExchangeOnline上(機能を実行者したユーザーの領域)に保管されます。
全ユーザーはダウンロードするまで文字データにアクセスすることができません。
また、Teams会議を開催した場所によってダウンロード場所が異なります。
下記を参考にダウンロードしてください。

予定された会議(単体)の場合

 カレンダーに登録された会議の会議詳細からダウンロードが可能。

予定された会議(繰り返し)の場合

 カレンダーに登録された会議の会議詳細からダウンロードが可能。

チーム会議の場合

「会議を開始しました」のスレッドに「トランスクリプト」が追加されている。
 

個人 / グループチャットの場合

 個人チャットの場合、チャット画面に「トランスクリプト」と表示されている。
 

参考

Teams 会議でのライブ トランスクリプションの表示 - Microsoft Support

【PowerAutomate】PowerAppsから値を受け取る方法 3選

PowerApps でアプリを作成する場合、ボタンクリックで PowerAutomate を起動するシーン多いと思います。
PowerApps から PowerAutomate 側に値を渡す際は、Run関数を利用すればよいのですが、PowerAutomate 側の値の受け取り方はいくつかあります。
今回は私が知る方法3つをご紹介したいと思います。

目次

1.PowerApps トリガーを利用する

最初にPowerApps トリガーを利用する方法です。
PowerApps から受信した値を利用したい場所で「PowerAppsで確認」を選ぶと新しいコンテンツが作成されます。


作成されるコンテンツの名称は下図のように「アクション名_項目名」になります。
一度作成したコンテンツは、同じフロー内であればいつでも利用できます。

PowerApps では、Run関数を利用して作成したコンテンツに渡したい値を記載すればOK。


ただし、下記点にご注意ください。
一度作成したコンテンツはフローから削除しても裏では残り続けるため、PowerApps で Run関数 を作成する際は「削除したコンテンツも存在する」ものとして値を設定する必要があります。
意外と忘れてしまう落とし穴なのでご注意を。。

2.PowerApps トリガーを利用する &「JSONの解析」を利用する

次は「JSONの解析」を利用して PowerApps から情報を受け取る方法です。



「PowerApps」トリガーの直下に「JSONの解析」アクションを配置します。
「コンテンツ」で「PowerAppsで確認」をクリックしてコンテンツを作成し、「スキーマ」には下記を参考に JSON を記述します。

//PowerAutomate 側
{
    "type": "object",
    "properties": {
        "XXXXX": {
            "type": "string"
        },
        "YYYYY": {
            "type": "integer"
        }
    }
}


「XXXXX」と「YYYYY」はパラメータの名称です。自由に変更してください。

PowerApps の Run関数は下記のような書き方になります。
JSON関数に記載するパラメータの名称は PowerAutomate で定めた名称と合わせる必要があります。
同様に、PowerApps から渡す値の型も PowerAutomate 側で定めた型(type)に合わせてください。

※PowerAutomate で「"type": "integer"」とした場合、PowerApps はValue関数を利用するなどして数値として渡す必要があります。

PowerAppsにおけるJSON関数については こちら をご覧ください。

送信ボタンの OnClick に記述するコマンド例

//JSON形式のパラメータをPowerAutomateに渡す
'フロー名'.Run(
    JSON(
        {
            XXXXX: TextInput.Text,
            YYYYY: Value(NumberInput.Text)
        },
        JSONFormat.IndentFour
    )
);

3.PowerApps(v2) トリガーを利用する

最後に PowerApps(v2) トリガーを利用する方法です。

「PowerAutomate(v2)」トリガーを選択して、「+入力の追加」をクリックすると下図のようにパラメータの種類が選択できます。
パラメータの種類を選択して名前を付けると、以後は作成した名前のパラメータが利用できます。



PowerApps のRun関数に入力する項目も PowerApps(v2) トリガーで作成した項目が必要で、上図における Run関数 は下記のような構成になります。

PowerApps から渡す値の型は PowerAutomate 側で定めた型(type)に合わせてください。
※PowerAutomate で「数」を選択した場合、PowerApps も数値型で渡す必要があります。

// Title=text型、No=number型
'フロー名'.Run( Title, No)

参考

#PowerApps のJSON関数を使ったFlowへのパラメータ渡し
Power Apps の JSON 関数【Docs】

【PowerAutomate】SharePointグループのメンバーを抽出してメールを送りたい

はじめに

SharePoint グループにはメールアドレスがないので、SharePointグループに対してメールを送れません。
しかし、PowerAutomate を使えば SharePointグループ に含まれるメンバーを抽出して、メールを送ることができます。

フローの完成イメージはこんな感じです。
一つ一つ手順を説明していきたいと思います。

目次

手順

SharePoint グループからメンバーを取得して全員にメールを送るフローを作成します。
1~4の順番にアクションを追加してください。

1.SharePoint に HTTP 要求を送信します

このアクションでSharePointグループに含まれる全メンバーのユーザー情報を取得します。
対象のサイトを選択して、URIには下記を入力してください。

URI:_api/web/sitegroups/getByName('SharePointグループ名')/users

結果、下記例のような情報を取得(出力)します。※一部省略

{
    "d": {
        "results": [
            {
                "__metadata": {"省略"},
                "Alerts": {"省略"},
                "Groups": {"省略"},
                "Id": 21,
                "IsHiddenInUI": false,
                "LoginName": "i:0#.f|membership|testuser@contoso.onmicrosoft.com",
                "Title": "テスト 太郎",
                "PrincipalType": 1,
                "Email": "testuser@contoso.onmicrosoft.com",
                "Expiration": "",
                "IsEmailAuthenticationGuestUser": false,
                "IsShareByEmailGuestUser": false,
                "IsSiteAdmin": false,
                "UserId": {
                    "NameId": "100320004d7fed7c",
                    "NameIdIssuer": "urn:federation:microsoftonline"
                },
                "UserPrincipalName": "testuser@contoso.onmicrosoft.com"
            }
        ]
    }
}

2.選択

「動的なコンテンツの追加」からそれぞれ下記の式を入力します。

開始 :{body('SharePoint_に_HTTP_要求を送信します')?['body']?['d']?['results']}

マップ:item()?['Email']

開始は、情報を取得する場所を示します。
SharePoint に HTTP 要求を送信します」アクションの出力結果を見ると ['d'] > ['results'] の下に各種ユーザー情報が含まれているのでそこから情報を取得します。

マップで item()?['Email'] とすることで取得した情報のうち Email 部分のみを抽出します。
今回の場合は、SharePoint グループに含まれるメンバーのメールアドレスを取得しているわけです。

結果、下記のように出力されます。

kurattyo@contoso.co.jp, testuser@contoso.co.jp, admin@contoso.co.jp

3.作成

「選択」アクションで取得した値はカンマ区切りです。
しかし、メールの宛先として使う場合はセミコロン区切りに修正する必要があるので、join関数で「選択」アクションで取得したメールアドレスをカンマ区切りに修正します。

「動的なコンテンツの追加」から下記の式を入力します。

入力: {join(body('選択'),';')}


結果、下記のように修正されて出力されます。

kurattyo@contoso.co.jp; testuser@contoso.co.jp; admin@contoso.co.jp

4.メールの送信

最後に抽出したメンバー全員にメールを送信します。
宛先で「作成」アクションの「出力」を選択します。

「作成」アクションでメールアドレスをセミコロン区切りにしたので、今回抽出した全ユーザに対して一度にメール送信ができるようになっています。

その他:1ユーザーごとにメール送信したい場合

「4.メールの送信」の宛先に、「作成」アクションの「出力」を選択すると全員に一括送信されます。
しかし、1ユーザーごとにメールを送信したい場合はどうすればよいのでしょうか?

「Apply to each」を追加してその中に「メールの送信」を配置します。
「以前の手順から出力を選択」に「選択」アクションの「出力」を配置してください。

「選択」アクションの「出力」は下記のようにカンマ区切りのメールアドレスが入っています。
カンマ区切りのメールアドレスを利用すると、1ユーザーごとに処理が行われるようになります。

kurattyo@contoso.co.jp, testuser@contoso.co.jp, admin@contoso.co.jp

参考

Power Automate get SharePoint Group Members & flow code snippets【YouTube】

【Azure】仮想マシンに固定のIPアドレスを追加する

はじめに

Azure に ADServer を構築する際、仮想マシンのプライベートIPアドレスに「静的な(=固定の)IPアドレス」を追加する必要があることを知ったので、今回はその手順をまとめました。

目次

パブリックとプライベート

Microsoft Azureの仮想マシンは、パブリックIPアドレスとプライベートIPアドレスがあります。
どちらも「動的なIPアドレス」が既定であり、IPアドレスの値は仮想マシン起動時に自動的に割り当てられます。

 - パブリックIPアドレス :インターネットから直接アクセスが可能な IPアドレス
 - プライベートIPアドレス:Azure 内のリソース間に限定された IPアドレス

プライベートIPアドレスによるネットワークは、インターネットから切り離されており、意図しないユーザによるアクセスやハッキングなどの被害から守ることができます。

「静的なIPアドレス」の登録に必要な条件

・ Azure にサインイン可能な「サブスクリプション」があること。(無料アカウントも可)
・ Azure にリソースグループ、仮想ネットワーク、仮想マシンが作成済みであること。

サブネットの追加手順

静的なIPアドレスを作成するためには、default 以外のサブネット が必要です。

1.Azure にサインインする。https://portal.azure.com/
2.Azure Portalリソースグループ を選択する。
3.リソースグループ一覧から対象のリソースグループを選択する。
4.リソースグループに含まれているリソースから 仮想ネットワーク を選択する。


5.「アドレス空間」>「その他のアドレス範囲の追加」に新しいアドレス空間を入力する。
  ※アドレス範囲は自動的に入力されます。
  ※プライベートIPアドレスは下記の範囲内から使うことが定められており、同時にパブリックIPアドレスとして使用はできません。

   - 10.0.0.0 ~ 10.255.255.255
   - 172.16.0.0 ~ 172.31.255.255
   - 192.168.0.0 ~ 192.168.255.255



6.「サブネット」>「+サブネット」をクリックする。
7.「サブネットの追加」画面で、追加するサブネットの情報を入力して保存する。
 - 名前               ⇒サブネット名を入力
 - サブネット アドレス範囲指定   ⇒5.で追加したアドレス範囲内の値を入力
 - ネットワークセキュリティグループ ⇒サブネットを使用する ネットワークセキュリティグループ を選択
 - 上記以外は既定値のままでOK
8.保存します。作成したサブネットは、左側メニュー > サブネット で確認できます。

静的なプライベートIPアドレス 追加手順

固定のプライベートIPアドレスを作成していきます。

9.サブネット作成後、リソースグループ内の 仮想マシン をクリックする。
10.左側メニューから「ネットワーク」をクリックする。
11.「受信ポートの規則」タブ >「受信ポートの規則を追加する」をクリックする。



12.「受信セキュリティ規則の追加」画面で各項目を入力して、「追加」をクリックする。
 - ソース  :着信トラフィックの指定がなければ「Any
 - ソースポート範囲:ポートを限定する必要がなければ「 *
 - 宛先   :発信トラフィックの指定がなければ「Any
 - サービス :この規則の宛先プロトコルとポート範囲を指定。特になければ「Custom
 - 宛先ポート:「8080」を入力
 - プロトコル:「TCP」を選択
 - アクション:「許可」を選択
 - 優先度  :「301以上~65000未満」の範囲で値を入力
  ※数値が小さいほど優先度は高くなり、規則は優先度順に処理されます。
 - 名前   :規則の名前を決める

13.追加後、左側メニューから「ネットワーク」をクリックして、作成した規則が「受信ポートの規則」に追加されていることを確認する。
14.同じ画面内の「ネットワーク インターフェース」をクリックする。



15.左側メニューから「IP構成」をクリックする。
16.「サブネット」を新規作成したサブネットに変更し、保存する。
17.「最新の情報に更新」をクリックして、変更後の値を表示する。
18.一覧表示されている IP構成 をクリックする。



19.遷移先のページで、プライベート IP アドレスの割り当てを [静的] に設定して、「保存」をクリックする。


仮想マシンIPアドレスが設定後の値になっていることを確認して終了です。

参考URL

 仮想ネットワーク サブネットの追加、変更、削除
 Azure portal を使用して VM のプライベート IP アドレスを構成する