Teams にてチームを部や本部など大人数で使用する際にタグ*1を使用すると、便利な反面、その管理負荷がかかります。
実際に何百人単位のチームにて役職ごとのタグを使用した際に、入社・退職・異動・昇格などでタグの付け替えか運用の課題としてあがり、その際に作成したフローを紹介します。
このフローを使うと、Excelのメンバーリストを更新するだけで、タグへの参加や削除を正確に行う事が出来ます。
フローの概要
今回はメンバーの中でマネージャーにのみタグをつける想定で作成します。
フローは2つ作成します。
1つ目のフローでは、Excelのメンバーリストをもとに現在のタグメンバーの差分を確認し、別のExcelに今回実行分の参加・削除対象者を抽出します。
2つ目のフローでは、抽出した参加・削除対象者のリストをもとにタグへの参加・削除を実行します。
2つに分けている理由としては、メンバーリストの更新手違いなどにより参加・削除対象者が大量に出てしまうことがないかなど、最終的に目視で確認するためです。
準備
対象のチームにあらかじめタグを作成しておきます。
Excelファイルを2つ準備し任意のSharePoint Onlineドキュメントライブラリに配置します。
メンバーリスト.xlsx
メンバーリストテーブル
チームに所属すべきメンバーをすべて記載するテーブルです。必須となる情報はUPNと役職です。
メンバーリスト_マネージャーテーブル
さらに、タグに追加するマネージャーのみのテーブルを作成するために、以下の作業をします。
- メンバーリストテーブルを選択し、「データ」タブをクリックし、「テーブルまたは範囲から」をクリックします。
- コードエディターにてプロパティの名前を「メンバーリスト_マネージャー」に変更し、役職列でマネージャーにフィルターします。
- フィルターできていることを確認したら「閉じて読み込む」をクリックします。
-
別シートにて「メンバーリスト_マネージャー」テーブルが表示されれば完了です。
対象者リスト.xlsx
参加対象者テーブル
フローによって抽出された参加対象者情報が出力されるテーブルです。必須となる情報はUPN・UserID・役職です。
削除対象者テーブル
フローによって抽出された削除対象者情報が出力されるテーブルです。必須となる情報はUPN・UserID・役職です。
テーブルリセットスクリプト
対象者のテーブルをフローの実行ごとにファイルを開いて前回の情報を消すのは手間になるので、テーブルの情報をリセットするOfficeスクリプトを作成しておき、フローの中でスクリプトを実行するアクションを入れます。
スクリプトの準備は、対象者リスト.xlsxをブラウザで開いて作成します。
参加対象者テーブルのリセットスクリプト
- ブラウザ版Excelの「自動化」タブをクリックし、「新しいスクリプト」をクリック、コードエディターが開くので一度内容を削除します。
- 以下のスクリプトを貼り付けます。
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getWorksheet("参加対象者");
let tables = sheet.getTables();for (var table_index in tables) {
// テーブルの行数を取得
let table_range = tables[table_index].getRowCount();
console.log(tables[table_index].getName() + "の行数");
console.log(table_range + "行");// テーブルを削除
console.log(tables[table_index].getName() + "の行の削除");
if (table_range > 0) {
tables[table_index].deleteRowsAt(0, table_range);
console.log(tables[table_index].getName() + ":削除実行");
} else {
console.log(tables[table_index].getName() + ":何もしない");
}
}
} -
名前を「参加対象者リセット」として「スクリプトを保存」をクリックして保存し、保存されたら「スクリプトの詳細」をクリックします。
-
「スクリプトに名前を付けて保存」をクリックし、対象者リストなどがある任意のライブラリに保存します。
削除対象者テーブルのリセットスクリプト
- 上記と手順は同じです。スクリプトは以下の内容を貼り付け、名前は「削除対象者リセット」とします。
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getWorksheet("削除対象者");
let tables = sheet.getTables();for (var table_index in tables) {
// テーブルの行数を取得
let table_range = tables[table_index].getRowCount();
console.log(tables[table_index].getName() + "の行数");
console.log(table_range + "行");// テーブルを削除
console.log(tables[table_index].getName() + "の行の削除");
if (table_range > 0) {
tables[table_index].deleteRowsAt(0, table_range);
console.log(tables[table_index].getName() + ":削除実行");
} else {
console.log(tables[table_index].getName() + ":何もしない");
}
}
}
整備実行ログ.xlsx
ログテーブル
追加・削除を実行したログを記載するテーブルです。
内容は任意ですが、いつ、だれに対してどの作業が行われたかわかる項目を用意しておきます。
フローの作成
タグ対象者抽出フロー
- トリガーを設定します。
都度実行となるため手動のトリガーを設定します。特に入力はいりません。
- 「変数を初期化」アクションを設定します。
このフローでは変数を4つ使用します。
以下は現在のタグメンバーのUserIDを全員分取得し格納する配列変数です。 以下は現在のタグメンバーのUserIDを1人分格納する文字列変数です。
以下はExcelのメンバーリスト_マネージャーのUserIDを全員分取得し格納する配列変数です。
以下はExcelのメンバーリスト_マネージャーのUserIDを1人分格納する文字列変数です。
- 「SharePoint ライブラリからスクリプトを実行する」アクションを設定します。
準備で作成したスクリプトを実行するアクションを2つ設定します。
- 「表内に存在する行を一覧表示」アクションを設定します。
メンバーリスト.xlsxでマネージャー一覧を取得します。
- 「タグのメンバーを一覧表示する」アクションを設定します。
現在のタグメンバーの一覧を取得します。
- 「配列変数に追加」アクションを設定します。
「タグのメンバーを一覧表示する」アクションの出力である動的アイテムの「ユーザーID」を挿入します。
挿入すると自動でApply to eachが生成されます。
- 「ユーザーの検索 (V2)」アクションを設定します。
「表内に存在する行を一覧表示」アクションの出力である動的アイテムの「UPN」を挿入します。
挿入すると自動でApply to eachが生成されます。
-
「変数の設定」アクションを設定します。
項番7で生成されたApply to each内に「変数の設定」アクションを追加し「ユーザーの検索 (V2)」アクションの出力である動的アイテムの「ユーザーID」を挿入します。
挿入すると自動でApply to eachが生成されます。 - 「条件」アクションを設定します。
項番8で生成されたApply to each内に「条件」アクションを追加し条件式に以下の式を挿入します。
ここで現在のタグメンバーにExcelのメンバーが含まれているか確認し参加対象者を抽出します。
contains(variables('Tag_UserID_List'), variables('Excel_UserID'))
- 「表に行を追加」アクションを設定します。
項番9の条件の「はいの場合」内に「表に行を追加」アクションを追加し、対象者リストの参加対象者テーブルに「ユーザーの検索 (V2)」アクションの出力である動的アイテムの「表示名」「ユーザープリンシパル名」「ユーザーID」「役職」を挿入します。
- 「ユーザーの検索 (V2)」アクションを設定します。
「表内に存在する行を一覧表示」アクションの出力である動的アイテムの「UPN」を挿入します。
挿入すると自動でApply to eachが生成されます。
- 「配列変数に追加」アクションを設定します。
項番11で生成されたApply to each内に「配列変数に追加」アクションを追加し
「ユーザーの検索 (V2)」アクションの出力である動的アイテムの「ユーザーID」を挿入します。
挿入すると自動でApply to eachが生成されます。
- 「変数の設定」アクションを設定します。
「タグのメンバーを一覧表示する」アクションの出力である動的アイテムの「ユーザーID」を挿入します。
挿入すると自動でApply to eachが生成されます。
- 「条件」アクションを設定します。
項番13で生成されたApply to each内に「条件」アクションを追加し条件式に以下の式を挿入します。
ここでExcelのメンバーにタグメンバーが含まれているか確認し削除対象者を抽出します。
contains(variables('Excel_UserID_List'), variables('Tag_UserID'))
- 「ユーザー プロフィールの取得 (V2)」アクションを設定します。
項番14の条件の「はいの場合」内に「ユーザー プロフィールの取得 (V2)」アクションを追加し、「タグのメンバーを一覧表示する」アクションの出力である動的アイテムの「表示名」「ユーザーID」を挿入します。
- 「表に行を追加」アクションを設定します。
項番14の条件の「はいの場合」内に「表に行を追加」アクションを追加し、対象者リストの参加対象者テーブルに「ユーザー プロフィールの取得 (V2)」アクションの出力である動的アイテムの「表示名」「ユーザープリンシパル名」「役職」を挿入します。
UserIDには「タグのメンバーを一覧表示する」アクションの出力である動的アイテムの「タグメンバーID」を挿入します。
タグ対象者抽出フローの作成は以上です。
タグ整備実行フロー
- トリガーを設定します。
都度実行となるため手動のトリガーを設定します。特に入力はいりません。
- 「表内に存在する行を一覧表示」アクションを設定します。
対象者リスト.xlsxで参加対象者一覧を取得します。
- 「タグにメンバーを追加する」アクションを設定します。
対象のチーム・タグを選択し、ユーザーIDには「表内に存在する行を一覧表示:参加対象者テーブル」アクションの出力である動的アイテムの「UserID」を挿入します。
挿入すると自動でApply to eachが生成されます。
- 「表に行を追加」アクションを設定します。
項番3で生成されたApply to each内に「表に行を追加」アクションを追加し各項目を設定します。
※例として日付は「yyyy-MM-dd」形式で入力されるように以下の式を挿入しています。
formatDateTime(addHours(utcNow(),9),'yyyy-MM-dd')
- 「表内に存在する行を一覧表示」アクションを設定します。
対象者リスト.xlsxで削除対象者一覧を取得します。
- 「グループからメンバーを削除する」アクションを設定します。
対象のチーム・タグを選択し、タグメンバーIDには「表内に存在する行を一覧表示:削除対象者テーブル」アクションの出力である動的アイテムの「UserID」を挿入します。
挿入すると自動でApply to eachが生成されます。
- 「表に行を追加」アクションを設定します。
項番6で生成されたApply to each内に「表に行を追加」アクションを追加し項番4と同様に各項目を設定します。
タグ整備実行フローの作成は以上です。
実行手順
- メンバーリスト.xlsxにて最新の組織情報に更新します。「データ」タブ内の「すべて更新」で参照しているメンバーリスト_マネージャーテーブルも更新します。
- タグ対象者抽出フローを実行します。
- 対象者リスト.xlsxを開き、参加・削除対象者テーブルが異常な人数になっていないかなど確認します。
- タグ整備実行フローを実行します。
- 整備実行ログ.xlsxを開き、対象者リスト.xlsxに記載されているメンバーの実行ログがあることを確認します。
おわりに
今回は大人数のチームのタグの整備を正確に行うフローを紹介しました。
ただし、1つのタグで200人近い人数を取り扱う際は、タグの200人上限によりエラーが発生する可能性があるのでご注意ください。
複数のタグを整備したいときは、メンバーリストや対象者テーブルにてテーブルを増やし、各フローでアクションをタグごとに繰り返し実行することで1つのフローで実施できます。
1つのタグで使用するアクションを1つのスコープにまとめることで、繰り返しの作成が楽になります。
*1:Teamsにおけるメンバーをグループ分けするためのラベル