キャンバス アプリでのレコード参照とポリモーフィック検索について
学校で研究論文を書いたとき、おそらく最後に参考文献の一覧を提供したことでしょう。 使用した実際の背景資料のコピーではなく、Web リンク、本のタイトルと著者、またはその他の情報を含めて、他の誰かが元のソースを追跡できるようにしました。 さまざまな種類の情報源を単一のリストに合わせ、オーディオ録音の横に新聞記事があり、それぞれに適切な引用向けの固有の詳細情報があります。 たとえば、Wikipedia の記事には多くの場合、参照の長いリストが含まれます。
キャンバス アプリでは、多くの場合データ ソースからダウンロードしたレコードのコピーを使用します。 LookUp および Filter 関数や ギャラリー コントロールの Selected プロパティを使用して、必要な特定のレコードを識別します。 フィルターまたは選択済みからのすべてのレコードは、同じテーブル タイプになるため、単純な .Field 表記を持つフィールドを使用できます。 多くの場合これらのコピーには参照情報が含まれているため、Patch 関数を使用して元のソースを更新します。
キャンバス アプリもレコード参照をサポートします。 研究論文の参照と同様に、レコード参照はレコードの完全なコピーを含まないものを指します。 このような参照は、任意のテーブルのレコードを参照できます。 また、研究論文の参照と同様に、異なるテーブルのレコードを 1 つの列に混在させることができます。
レコード参照の多くの操作は、レコードの操作と同じです。 レコード参照を相互に比較したり、完全なレコードと比較したりできます。 完全なレコードを備えたルックアップと同じように、レコード参照の値を Patch 関数で設定できます。
使用上の重要な違いが 1 つあります。それは、レコード参照がどのテーブルを参照するかを最初に確立しない限り、レコード参照のフィールドに直接アクセスできないことです。 これは、キャンバス アプリでは、数式を記述するときにすべての種類を認識している必要があるためです。 アプリが実行されるまでレコード参照の種類を認識しないと、単純な .Field 表記を直接使用することはできません。 最初に、動的にIsType関数を使ってテーブル タイプを決定し、次に AsType 関数の結果に .Field 表記を使います。
テーブル タイプは、テーブル内の各レコードのスキーマを参照します。 各テーブルには、名前とデータ型が異なる一意のフィールド セットがあります。 テーブルの各レコードはその構造を継承します。2 つのレコードが同じテーブルからのものである場合、それらは同じテーブル タイプになります。
注意
さまざまなコネクタから選択して、キャンバス アプリのさまざまなタイプのデータ ソースに接続できます。 ただし、Power Apps Studio 内部のキャンバス アプリを操作する場合、Microsoft Dataverse の列は、他のデータ ソースすべてと同様にフィールドと呼ばれます。 列は、Dataverse 内部の列を参照する場合にのみ使用されます。 詳細: Dataverse の新しくなった用語
ポリモーフィック検索
Microsoft Dataverse はレコード間の関連付けをサポートします。 取引先企業テーブルの各レコードには 取引先責任者ルックアップ列があり、これは取引先担当者テーブルのレコードに対応します。 ルックアップは、取引先担当者のレコードのみを参照でき、たとえばチーム テーブルのレコードを参照することはできません。 ルックアップに使用できる列は常にわかっているため、最後の詳細は重要です。
Dataverse は、ポリモーフィック ルックアップもサポートしており、セット内の任意のテーブルのレコードを参照できます。 たとえば、所有者列は、ユーザー テーブルまたはチーム テーブルのレコードを参照できます。 異なるレコードの同じルックアップ列は、異なるテーブルのレコードを参照する可能性があります。 この場合、どの列が使用可能になるかを常に把握しているとは限りません。
キャンバス レコード参照は、Dataverse でポリモーフィック検索を操作するために設計されました。 また、このコンテキスト以外でもレコード参照を使用することもができます。これが 2 つの概念の違いです。
次のセクションでは、所有者検索で作業することにより、これらの概念について調べ始めます。
レコード所有者の列を表示する
Dataverse のすべてのテーブルには、所有者列が含まれます。 この列は削除できず、別の列を追加することもできず、常に値が必要です。
その列を取引先企業テーブルに表示するには:
Power Apps にサインインします。
左側のペイン バーで、データ > テーブルを選択します。
テーブルのリストで、アカウントを選択します。
右上隅で、フィルターの一覧 (既定で既定に設定される) を開いてから、すべてを選択します。
所有者列が表示されるまで下にスクロールします。
このルックアップ列は、チーム テーブルまたはユーザー テーブルのレコードを参照できます。 これらのテーブルのすべてのレコードに、所有者問題が発生した場合は、サポートされているロールを確認してください。
このグラフィックは、取引先企業のシンプルなギャラリーを表しており、取引先企業テーブルがデータ ソースとしてアプリに追加されています。
重要
このトピック全体にわたって、図には Dataverse に付属するサンプルデータの一部ではない名前やその他の値が表示されます。 この手順では、特定の結果に対するコントロールの構成方法を正確に示しますが、エクスペリエンスは組織のデータに基づいて異なります。
ギャラリーで各取引先企業の所有者を表示するため、数式 ThisItem.Owner.Name を使用する場合があるかもしれません。 ただし、チーム テーブルの名前フィールドがチーム名であり、ユーザー テーブルの名前フィールドがフル ネームです。 アプリを実行するまで、アプリはどのタイプのルックアップを使用しているかを知ることができず、取引先企業のレコード間で異なる可能性があります。
この差異に適応できる数式が必要です。 また、所有者のものかもしれないテーブル タイプ (この場合、ユーザーとチーム) に対して、データソースを追加する必要があります。 次の 3 つのデータ ソースをアプリに追加します:
これらのデータ ソースを配置して、次の数式を使用してユーザーまたはチームの名前のいずれかを表示します:
If( IsType( ThisItem.Owner, Teams ),
"Team: " & AsType( ThisItem.Owner, Teams ).'Team Name',
"User: " & AsType( ThisItem.Owner, Users ).'Full Name' )
この式では、IsType 関数が所有者フィールドをチーム テーブルに対してテストします。 そのテーブル タイプの場合、AsType 関数はそれをチーム レコードにキャストします。 この時点で、.Field 表記を使用することにより、チームの名前を含むチーム テーブルのすべてのフィールドにアクセスできます。 IsType により、所有者がチーム テーブルのレコードでないと決定された場合、そのフィールドはユーザー テーブルのレコードである必要があります。これは、所有者フィールドが必須であるためです (ブランクにはできません)。
レコード参照のフィールドを使用するには、最初に AsType 関数を使って、特定のテーブルタイプにキャストする必要があります。 システムは使用するテーブル タイプを認識していないため、所有者フィールドから直接フィールドにアクセスすることはできません。
AsType 関数は、所有者フィールドが要求されているテーブル タイプと一致しない場合にエラーを返しますが、IfError 関数を使ってこの式を単純化できます。 まず、試験的な機能数式レベルのエラー管理を有効にします:
次に、前の数式を次の式に置き換えます:
IfError(
"Team: " & AsType( ThisItem.Owner, Teams ).'Team Name',
"User: " & AsType( ThisItem.Owner, Users ).'Full Name' )
所有者に基づいてフィルター処理する
これで、レコード参照の作業で最も難しい部分を完了しました。 その他の使用事例は、レコードのフィールドにアクセスしないため、より簡単になります。 この時点で、このセクションで説明するフィルター処理を行います。
ギャラリーの上に コンボ ボックス コントロールを追加し、新しいコントロールの次のプロパティを設定します:
- Items:
Users
- SelectMultiple:
false
このコンボ ボックスから選択した特定のユーザーによりギャラリーをフィルター処理するには、ギャラリーの Items プロパティをこの数式に設定します:
Filter( Accounts, Owner = ComboBox1.Selected )
重要
このトピックの手順は、手順を正確に実行すれば正確です。 ただし、コントロール名が異なる場合、その名前でコントロールを参照する任意の数式は失敗します。 同じ種類のコントロールを削除して追加する場合、コントロールの名前の最後にある番号が変わります。 エラーを示す任意の数式については、すべてのコントロールの正しい名前が含まれていることを確認してください。
レコード参照を他のレコード参照または完全なレコードと比較しているため、IsType または AsTypeを使用する必要はありません。 ComboBox1.Selected は、ユーザー テーブルから派生しているため、アプリではそのテーブル タイプが特定できます。 所有者がチームである取引先企業は、フィルター条件と一致しません。
ユーザーまたはチームのいずれかによるフィルタリングをサポートすることにより、少し手の込んだものを取得できます。
ギャラリーをサイズ変更してコンボ ボックスを移動することにより、画面の上部にスペースを作り、ラジオ コントロールをギャラリーの上に挿入してから、次のプロパティを新しいコントロールに設定します:
- Items:
[ "All", "Users", "Teams" ]
- Layout:
Layout.Horizontal
- Items:
コンボ ボックス コントロールについては、次のプロパティを設定します (コンボ ボックスが表示されない場合は、ラジオ コントロールのユーザーを選択します):
- Visible:
Radio1.Selected.Value = "Users"
- Visible:
コンボ ボックス コントロールをコピーして貼り付け、コピーをオリジナルの上に直接移動してから、コピーに対する次のプロパティを設定します:
- Items:
Teams
- Visible:
Radio1.Selected.Value = "Teams"
アプリは、ラジオ コントロールの状態に応じて、一度に 1 つのコンボ ボックスのみを表示します。 これらは互いに直接上部にあるため、内容を変更するコントロールと同じように表示されます。
- Items:
最後に、ギャラリー コントロールの Items プロパティを次の数式に設定します:
Filter( Accounts, Radio1.Selected.Value = "All" Or (Radio1.Selected.Value = "Users" And Owner = ComboBox1.Selected) Or (Radio1.Selected.Value = "Teams" And Owner = ComboBox1_1.Selected) )
これらの変更により、すべてのレコードを表示したり、ユーザーまたはチームのいずれかに基づいてそれらをフィルター処理できます。
数式は完全に委任可能です。 ラジオ ボタンの値を比較する部分はすべてのレコード間で一定であり、フィルターの残りの部分が Dataverse に送信される前に評価されます。
所有者の種類でフィルター処理する場合は、IsType 関数を使用できますが、まだ委任可能ではありません。
Patch を使用して所有者を更新する
他の検索と同じ方法で所有者フィールドを更新できます。 現在選択されている取引先企業の所有者を最初のチームに設定するには:
Patch( Accounts, Gallery1.Selected, { Owner: First( Teams ) } )
アプリは First( Teams ) の種類を認識するため、このアプローチは通常の検索と変わりません。 代わりに最初のユーザーが必要な場合は、その部分を First( Users ) に置き換えます。 Patch 関数は、所有者フィールドは、これら 2 つのテーブル タイプのいずれかに設定できることを知っています。
この機能をアプリに追加するには:
ツリー ビュー ウィンドウで、ラジオ コントロールと 2 つの コンボ ボックス コントロールを同時に選択します。
省略記号メニューで、これらの項目をコピーするを選択します。
同じメニューで、貼り付けを選択します。
コピーしたコントロールをギャラリーの右側に移動します。
コピーした ラジオ コントロールを選択してから、次のプロパティを変更します:
- Items:
[ "Users", "Teams" ]
- 既定値:
If( IsType( Gallery1.Selected.Owner, Users ), "Users", "Teams" )
- Items:
ラジオ コントロールでユーザーを選択して、ユーザーを一覧表示する コンボ ボックス コントロールが表示されるようにします。
表示される コンボ ボックス コントロールを選択してから、DefaultSelectedItems プロパティを次の式に設定します:
If( IsType( Gallery1.Selected.Owner, Users ), AsType( Gallery1.Selected.Owner, Users ), Blank() )
ラジオ コントロールでチームを選択して、チームを一覧表示する コンボ ボックス コントロールが表示されるようにします。
ラジオ コントロールを選択して、ユーザーに非表示の コンボ ボックス コントロールから選択肢を取り除きます。
表示されるチーム用 コンボ ボックス コントロールを選択してから、その DefaultSelectedItems プロパティを次の式に設定します:
If( IsType( Gallery1.Selected.Owner, Teams ), AsType( Gallery1.Selected.Owner, Teams ), Blank() )
ボタン コントロールを挿入し、コンボ ボックス コントロールの下に移動してから、ボタンの Text プロパティを
"Patch Owner"
に設定します。ボタンの OnSelect プロパティを次の数式に設定します:
Patch( Accounts, Gallery1.Selected, { Owner: If( Radio1_1.Selected.Value = "Users", ComboBox1_2.Selected, ComboBox1_3.Selected ) } )
コピーされた ラジオ および コンボ ボックス コントロールには、ギャラリーで現在選択されている取引先企業の所有者が表示されます。 同じコントロールを使用して、ボタンを選択することにより、取引先企業の所有者を任意のチームまたはユーザーに設定できます:
フォームを使用して所有者を表示する
ユーザー定義カードを追加して、フォーム内の所有者フィールドを表示できます。 現時点で、フォーム コントロールを使用してフィールドの値を変更することはできません。
編集フォーム コントロールを挿入してから、サイズ変更して右下隅に移動します。
画面の右側にあるプロパティ タブで、データ ソースの一覧を開いてから、取引先企業を選択します。
フォームの Item プロパティを
Gallery1.Selected
に設定します。画面の右側にあるプロパティ タブで、フィールドの編集を選択します。
フィールド ウィンドウで、省略記号を選択してから、ユーザー定義カードの追加を選択します。
新しいカードがフォーム コントロールの下部に表示されます。
カードを必要に応じてサイズ変更して、すべてのテキストを表示します。
ラベル コントロールをユーザー定義カードに挿入してから、ラベルの Text プロパティをギャラリーで使用した数式に追加します:
If( IsType( ThisItem.Owner, Teams ), "Team: " & AsType( ThisItem.Owner, Teams ).'Team Name', "User: " & AsType( ThisItem.Owner, Users ).'Full Name' )
ギャラリーでの選択ごとに、レコードの所有者を含む、取引先企業のその他のフィールドがフォームに表示されます。 パッチ ボタンを使用して所有者を変更する場合、フォーム コントロールもその変更を表示します。
顧客の列を表示する
Dataverse では、顧客ルックアップ列は、所有者に非常によく似た別のポリモーフィック ルックアップです。
所有者は、テーブルごとに 1 つに制限されていますが、テーブルには 0、1、またはそれ以上の顧客ルックアップ列を含めることができます。 取引先担当者システム テーブルには、顧客ルックアップ列である会社名列が含まれています。
新規列に顧客データ型を選択することにより、顧客ルックアップ列をテーブルにさらに追加できます。
顧客ルックアップ フィールドは、取引先企業テーブルまたは取引先担当者テーブルのレコードを参照できます。 これらのテーブルに IsType と AsType 関数を使用します。そのため、データ ソースとして追加する良い機会です (チームおよびユーザーはそのままにしておくことができます)。
顧客および所有者フィールドの処理は非常に似ているので、文字通りアプリをコピー (ファイル > 名前を付けて保存、次に別の名前を指定します) して、次の簡単な置き換えを実行できます:
場所 | 所有者のサンプル | 顧客のサンプル |
---|---|---|
全体 | 所有者 | '顧客名' |
全体 | ユーザー | 取引先企業 |
全体 | チーム | 取引先担当者 |
ギャラリーの Items プロパティ | 取引先企業 | 取引先担当者 |
フォームの Items プロパティ | 取引先企業 | 取引先担当者 |
ボタンの OnSelect プロパティでの パッチの最初の引数 |
取引先企業 | 取引先担当者 |
フィルター ラジオの Items プロパティ | [ "すべて"、 "ユーザー"、 "チーム" ] | [ "すべて"、 "取引先企業"、 "取引先担当者" ] |
パッチ ラジオの Items プロパティ | [ "ユーザー"、"チーム" ] | [ "取引先企業"、"取引先担当者" ] |
コンボ ボックスの表示可能プロパティ | "ユーザー" と "チーム" | "取引先企業" と "取引先担当者" |
たとえば、新しいギャラリーには次の Items プロパティが必要です:
Filter( Contacts,
Radio1.Selected.Value = "All"
Or (Radio1.Selected.Value = "Accounts" And 'Company Name' = ComboBox1.Selected)
Or (Radio1.Selected.Value = "Contacts" And 'Company Name' = ComboBox1_1.Selected)
)
顧客と所有者間の 2 つの重要な違いにより、ギャラリーやフォーム内の数式への更新が必要になります:
取引先企業と取引先担当者間の 1 対多のリレーションシップは、テーブル タイプを名前で参照する場合は優先されます。 取引先企業の代わりに、[@Accounts] を使用し、取引先担当者の代わりに、[@Contacts] を使用します。 グローバル曖昧性解消演算子を使うことにより、IsType と AsType のテーブル タイプを参照していることが確認できます。 この問題は、ギャラリーとフォーム コントロールのレコード コンテキストにのみ存在します。
所有者フィールドには値が必要ですが、顧客フィールドは空白になります。 種類名なしで正しい結果を表示するには、IsBlank 関数を使用してこのケースをテストし、代わりに空のテキスト文字列を表示します。
これらの変更はいずれも同じ数式で行われ、フォームのユーザー定義カードと、ギャラリーのラベルコントロールの Text プロパティでも表示されます:
If( IsBlank( ThisItem.'Company Name' ), "",
IsType( ThisItem.'Company Name', Accounts ),
"Account: " & AsType( ThisItem.'Company Name', Accounts ).'Account Name',
"Contact: " & AsType( ThisItem.'Company Name', Contacts ).'Full Name'
)
これらの変更により、取引先担当者テーブルで会社名フィールドを表示および変更できるようになりました。
ルックアップ列について理解する
関連ルックアップ列は、このトピック内ですでに説明したものとは少し異なります。 このトピックの前半で説明したパターンを適用することから始め、次に他のテクニックを学びます。
ファックス テーブルから始めましょう。 このテーブルには、ポリモーフィックな関連ルックアップ列があり、取引先企業、取引先担当者、およびその他のテーブルを参照できます。 顧客用のアプリを取得し、FAX 用にそれを変更できます。
場所 | 顧客のサンプル | FAX のサンプル |
---|---|---|
全体 | '顧客名' | 関連 |
ギャラリーの Items プロパティ | 取引先担当者 | FAX |
フォームの Items プロパティ | 取引先担当者 | FAX |
ボタンの OnSelect プロパティでの パッチの最初の引数 |
取引先担当者 | FAX |
もう一度、データ ソースを追加する必要があります: 今回は FAX 用です。 ビュー タブで、データソースを選択します:
関連の重要な違いは、それが取引先企業および取引先担当者に限定されないということです。 実際のところ、テーブルのリストは、カスタム テーブルで拡張できます。 ほとんどのアプリはこの点に変更を加えなくても対応できますが、ギャラリーとフォームのラベルの数式を更新する必要があります:
If( IsBlank( ThisItem.Regarding ), "",
IsType( ThisItem.Regarding, Accounts ),
"Account: " & AsType( ThisItem.Regarding, Accounts ).'Account Name',
IsType( ThisItem.Regarding, Contacts ),
"Contacts: " & AsType( ThisItem.Regarding, Contacts ).'Full Name',
""
)
これらの変更を加えた後、所有者および顧客検索を実行したように関連検索を使用します。
関連の関連付けについて
関連には多対一の関連付けが含まれるため、関連は所有者および顧客とは異なります。 定義上、逆の一対多の関係により、First( Accounts ).Faxes と記述できます。
話を戻して、テーブル定義を見てみましょう。 Dataverse では、Fax、タスク、メール、メモ、電話、手紙、チャットなどのテーブルは、活動と指定されます。 独自のカスタム活動テーブルを作成することもできます。 活動テーブルを表示または作成すると、その設定がその他の設定の下に表示されます。
他のテーブルは、テーブルの設定で活動タスクとして有効になっている場合、活動テーブルに関連付けることができます。 取引先企業、取引先担当者、および他の多くの標準テーブルがそのように指定されています (改めて、その他の設定の下)。
すべての活動テーブルと活動タスク テーブルには、暗黙の関係があります。 画面上部でフィルターをすべてに変更した場合、Fax テーブルを選択し、リレーションシップ タブを選択し、関連ルックアップの対象となりうるすべてのテーブルが表示されます。
取引先企業テーブルのリレーションシップを表示する場合、関連ルックアップ フィールドのソースとなりうるすべてのテーブルが表示されます。
どういう意味ですか ?
- 数式を作成するときは、活動テーブルのリストが固定されていないとみなす必要があり、独自のテーブルを作成できます。 数式は、予期しない活動テーブルを適切に処理する必要があります。
- 活動タスクおよび活動には、一対多の関連付けがあります。 取引先企業に関連するすべての FAX を簡単に要求できます。
アプリでこの概念を調べるには:
別の画面を追加します。
ギャラリー コントロールを挿入し、サイズ変更してから、画面の左側に移動します。
画面の右側にあるプロパティ タブで、ギャラリーの Items を取引先企業に設定します。
ギャラリーのレイアウトをタイトルに設定してから、タイトル フィールドを取引先企業名に設定します。
2 つ目のギャラリーを追加し、サイズ変更してから、画面の右側に移動します。
新しいギャラリーの Items プロパティを
Gallery2.Selected.Faxes
に設定します。この手順では、指定した取引先企業に対するフィルター処理された FAX の一覧を返します。
ギャラリーのレイアウトをタイトルとサブタイトルに設定してから、タイトル フィールドを件名フィールド (小文字で件名 (subject) の場合がある) を表示するように設定します。
取引先企業の一覧で項目を選択すると、FAX の一覧にはその取引先企業のみの FAX が表示されます。
活動テーブル
前のセクションで説明したように、取引先企業のすべての FAX を表示できます。 ただし、FAX、電子メール メッセージ、電話、その他のやり取りを含む、取引先企業のすべての活動を表示することもできます。
後者のシナリオでは、活動テーブルを使用します。 右上隅のすべてをオンにすることによりこのテーブルを表示し、テーブルのリストからフィルターを削除できます。
活動テーブルは特別です。 レコードを Fax テーブルに追加するたびに、システムはレコードをすべてのアクティビティテーブルに共通の列を持つ活動テーブルに作成します。 それらの列のうち、件名は最も興味深いものの 1 つです。
前の例の 1 行だけを変更することで、すべての活動を表示できます。 Gallery2.Selected.Faxes
を Gallery2.Selected.Activities
に置き換えます。
レコードは活動テーブルから来ていますが、それでも IsType 関数を使って、それらがどのような種類の活動であるかを識別することができます。 繰り返しますが、テーブル タイプで IsType を使用する前に、必要なデータ ソースを追加する必要があります。
この式を使用すると、ギャラリー内のラベル コントロールにレコードの種類を表示できます。
If( IsType( ThisItem, Faxes] ), "Fax",
IsType( ThisItem, 'Phone Calls' ), "Phone Call",
IsType( ThisItem, 'Email Messages' ), "Email Message",
IsType( ThisItem, Chats ), "Chat",
"Unknown"
)
AsType を使用して特定の種類のフィールドにもアクセスできます。 たとえば、この式は各活動のタイプを決定し、電話の場合は、電話番号テーブルからの電話番号と通話方向を示します。
If( IsType( ThisItem, Faxes ), "Fax",
IsType( ThisItem, 'Phone Calls' ),
"Phone Call: " &
AsType( ThisItem, 'Phone Calls' ).'Phone Number' &
" (" & AsType( ThisItem, 'Phone Calls' ).Direction & ")",
IsType( ThisItem, 'Email Messages' ), "Email Message",
IsType( ThisItem, Chats ), "Chat",
"Unknown"
)
その結果、アプリは活動の完全なリストを表示します。 件名フィールドは、数式で考慮されるかどうかに関係なく、すべての種類の活動に対して表示されます。 知っている活動の種類については、種類名および各活動に関する種類固有の情報を表示できます。
メモ テーブル
これまでのところ、関連の例はすべて、活動に基づいていますが、メモ テーブルは別のケースを表しています。
テーブルを作成するときに、添付ファイルを有効にできます。
添付ファイルを有効にするためのチェックボックスを選択すると、取引先企業テーブルの図でわかるように、メモ テーブルの関連の関係性が作成されます。
この違い以外は、活動を使用するのと同じ方法で関連検索を使用します。 添付ファイルが有効になっているテーブルには、この例のようにメモとの 1 対多の関係があります。
First( Accounts ).Notes
注意
この記事の執筆時点では、関連ルックアップはノート テーブルに対して利用できません。 関連列に基づいて読み取りまたはフィルタリングすることはできず、パッチを使って列を設定することもできません。
ただし、逆にメモの一対多の関連付けは利用できるため、添付ファイルが有効になっているレコードのメモの一覧をフィルター処理できます。 Relate 関数を使用してレコードのメモ テーブルにメモも追加できますが、この例のように、最初にメモを作成する必要があります。
Relate( ThisItem.Notes, Patch( Notes, Defaults( Notes ), { Title: "A new note" } ) )
活動パーティ
現時点で、キャンバス アプリは活動パーティーをサポートしていません。
注意
ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)
この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。