Microsoft Office365 Education (Teams) で科目のチームを PowerShell で一気に自動生成する

マイクロソフト社の Office 365 Education で科目（"EDU_Class"）のチームをCSVファイルから自動で一斉につくる PowerShell プログラムです。急に遠隔授業を実施することになった学校の担当者の方のお役に立つかもしれませんので公開させていただきます。質問や感想はコメント欄にお願いします。

- 本記事で紹介しているのは Office  365 Education ですでにユーザ登録されている学生を科目ごとのチームに登録する方法です。Office 365 Education 開始直後で、まだ学生を Office 365 に登録していない場合には https://qiita.com/hisaho/items/58e4e4024ee73280ece7 の方法で登録してください。

- １０分でできる Teams での遠隔授業はマイクロソフトの hisaho さんが https://qiita.com/hisaho/items/12837a169bd6f1d90d5c でご紹介されててすごくわかりやすいです。上記の記事で手でチームを作ることは簡単にできますが、この記事ではチームを自動でいっぺんに作る方法をご紹介します。

#科目一覧のCSVファイル（kamoku.csv）を準備する

科目のCSVファイルを以下のように作ります。１カラム目から「科目コード」、「クラス名」、「科目名」、「教員のメールアドレス（Office365 アカウント）」です。作られるチーム名は「科目コード-クラス名-科目名」になります。科目コード、クラス名、科目名は単なる文字列として扱いますので学校の事情にあわせて変更してください。科目コードが不要な場合には適当な文字列にしてください。

以下の例では「数学」のチームはメールアドレスで指定された教員を所有者として作成し、J1 という名前のクラスの学生を追加します。クラス名は学校にあったものに変更してください（例：中学部は J1A, J1B, J2A, J2B, J3A, J3B, 高校部は H1A, H1B, H2A, H2B, H3A, H3B など） 学生名簿の作り方は次のセクションで説明します。

```
# kamoku.csv の内容
000000, J1, 数学, teacher01@domain.com
000001, J1, 国語, teacher02@domain.com
```

# クラスごとに学生名簿のCSVファイル（クラス名.csv）をつくる

"```クラス名```.csv" という名前のファイルをクラス分つくっておきます。これはさきほどの科目一覧のCSVファイル（kamoku.csv) から科目をつくるときに、最初に登録する学生の Office365 アカウントのリストになります。ファイル名は kamoku.csv 中のクラス名（この例では J1）に .csv をつけたものにします。

例えは、中学部は J1A, J1B, J2A, J2B, J3A, J3B, 高校部は H1A, H1B, H2A, H2B, H3A, H3B とすると J1A.csv, J1B.csv, J2A.csv, J2B.csv, ..., H3B.csv をつくっておくことになります。

内容は以下のようにファイル名（この例では J1.csv）で指定されるクラス（J1）に所属する「学生のメールアドレス（Office365 アカウント）」のリストです。

```
# J1.csv の内容
student01@domain.com
student02@domain.com
```

# PowerShell プログラム本体（create-teams.ps1）

以下のプログラムを CSVファイルと同じ場所に置いて実行してください。

事前準備として、PowerShell に MicrosoftTeams モジュールをインストールする方法などは、プログラムの最初のコメント行を参照してください。

```
# create-teams.ps1 の内容
#
# 20200423 hrn, MIT License
# Refer: https://docs.microsoft.com/en-us/powershell/module/teams/?view=teams-ps

# このスクリプトを実行する前に以下を実行してください
# まず、PowerShell を管理者権限で実行してください
#
# 念のため、現在のモジュールをアンインストール
# Uninstall-Module  MicrosoftTeams -AllVersions
#
# Template をつかって EDU_Class を作るためにバージョン 0.9.6 のモジュールをインストール
# Install-Module -Name MicrosoftTeams -RequiredVersion 0.9.6 -SkipPublisherCheck
#
# チームを作成するユーザでログイン、以下を実行するといつものログイン画面がでるのでログイン
# このユーザも所有者になるので注意
# Connect-MicrosoftTeams 
#
# さいごに kamoku.csv, 必要な数の クラス名.csv, create-teams.ps1 の３点を同じフォルダに置いて実行
# create-teams.ps1
#
# 事前に CSV ファイル の読み込みと動作をチェックしたいときは、最初の $debug を $True にすればデバッグメッセージだけが表示され実際には実行されません。
# 事前チェックで問題がなければ、 $False に直して実行してください
#


# デバッグオプション（実行時は $False, CSV 読み込みテスト時は $True)
$debug = $False

# 科目一覧のCSVファイルを読み込み
$kamokus = Get-Content "kamoku.csv" | ConvertFrom-CSV -Header id, class, name, owner 

# 1行ずつ読み込んで科目ごとの「クラス（EDU_Class）」チームをつくります
$kamokus | ForEach-Object {
	$kamoku = %{
		New-Object PSObject -Property @{
			id = $_.id
			class = $_.class
			name = $_.name
			owner = $_.owner
		}
	}
	# チーム名をデバッグ表示（チーム名を変えたいときは以下の１行を編集する）
	$teamname = $kamoku.id + "-" + $kamoku.class + "-" + $kamoku.name
	"Creating team: " + $teamname

	# チームを作る
	if (-Not $debug) { $group = New-Team -DisplayName "$teamname" -Template "EDU_Class" }

	# 所有者（科目の担当教員）を追加
	$teamowner = $kamoku.owner
	"Onwer: " + $teamowner
	if (-Not $debug) { Add-TeamUser -GroupId $group.GroupId -User "$teamowner" -Role "Owner" }

	# ほかの管理者を追加（ここに記入したユーザはすべての科目で管理者になります）
	# if (-Not $debug) { Add-TeamUser -GroupId $group.GroupId -User "alice@domain.com" -Role "Owner" }

	# クラスの学生名簿を読み込む
	$classcsv = $kamoku.class + ".csv"
	"Reading " + $classcsv
	$students = Get-Content "$classcsv" | ConvertFrom-CSV -Header email

	# 1行ずつ読み込んで学生をチームに追加する
	$students | ForEach-Object {
		$student = %{
			New-Object PSObject -Property @{
				email = $_.email
			}
		}
		$studentemail = $student.email
		"Add: " + $studentemail
		if (-Not $debug) { Add-TeamUser -GroupId $group.GroupId -User "$studentemail" }
	}
	"Completed creating team: " + $teamname
	"---"
}
```