2020年4月

2020年4月20日 (月)

Microsoft Teams 内の各チームには[ファイル]タブが用意されています。このファイルタブの実体は SharePoint サイトです。

もっというと、チーム内の[ファイル]タブは SharePoint サイト上にある「ドキュメント」ライブラリ内のチャネルごとに生成されるフォルダーが紐づいています。しかし、Teams の[ファイル]タブは、SharePoint の標準的な機能の一部が実装されていません。もちろん、あくまで[ファイル]タブ経由で利用するとという限定的な話であり、[ファイル]タブのコマンドバーから "SharePoint で開く" をクリックすることで、Webブラウザーから直接 SharePoint のライブラリにアクセスすれば、標準機能がフルに利用できます。

Teams 内から SharePoint サイトにアクセスする

※補足 : Teams がリリースされて間もないころはSharePoint が持つファイル管理機能のごく基本的な機能のみしか提供されていなかったのですが、数か月前からだいぶ SharePoint のオリジナルの持つ機能に近づいては来ています。

そのため、今回のブログのタイトルにあるような Power Automate を使った承認フローを実装するには、少し工夫が必要です。

Webブラウザーから直接SharePointサイトを利用するときには、格納しているファイルに対して承認フローを開始する方法としてはファイルのプロパティを確認し、例えば "下書き" から "公開" といった値に変更したときに承認フローを自動的に開始できるようにすることも少なくありません。しかし、[ファイル]タブでは現時点(2020/4/18)ではプロパティを編集できません。さらに、手動でワークフローを開始するにもフローを手動開始するコマンドメニューがありません。SharePoint 標準では本来はできることです。

そこで、[ファイル]タブを使ってフローを開始するのであれば、手動開始とプロパティの値をトリガーにすることはあきらめる必要があります。「ファイルを新規に作成したら」という自動的にフローが開始されるトリガーを使うのが妥当でしょう。

例えば、[ファイル] タブ内の特定のフォルダーにファイルを移動したらフローが開始されるというような実装を考えます。ただここで問題なのが、SharePoint コネクターのトリガーによってはサブフォルダーからはフローが開始されないものがあるということ。[ファイル]タブはサブフォルダーに紐づいているので、ここが重要なのです。

以上のことから、トリガーには次のいずれかを使うようにします。このトリガーはサブフォルダーでも動作します。

  • ファイルが作成されたとき(プロパティのみ)
  • ファイルが作成または変更されたとき(プロパティのみ)

自動開始を前提とするので、フローを起動したときに承認者を選択させることができないので、最初から承認者を固定で指定しておくか、上司の自動取得をするなど何かしら工夫をしておく必要があります。

ところで、トリガーを設定するときですが、SharePoint サイトとの関係が把握できていないとどのフォルダーをトリガ―指定すればよいのか迷うところです。チャネルとフォルダーの関係を図解しておくと次のようになります。トリガーを構成するときには、この図を念頭に置いたうえで、チーム名と同じ名前の SharePoint サイトのURLとフォルダーを指定するようにしましょう。

Teams 内のチャネルとSharePointフォルダーの関係

なお、チャネルを最初に作ったときに(もっと正確にいうと、チャネルを作成後に[ファイル]タブに初回アクセスしたときに生成) SharePoint側にフォルダーが作成されるのですが、フォルダー生成後はチャネル名を変更しても既存のフォルダ名は変更されません。そのため、現在 Teams 内のファイルタブには関連づいているフォルダー名が表示されるようになっているので、これを手掛かりにするとよいでしょう。

Teamsファイルタブにひもづくフォルダー名

以上を踏まえ、最もシンプルな承認フローを構築すると次のようになります。ここでは細かい設定については触れませんが、詳細は例えば、既存の承認用のテンプレートを使いトリガー部分を差し替えるなどしてみてください。

承認フロー

 

【研修】SharePointユーザーのための Power Apps & Power Automate入門

AdobeStock_194043476対象者は SharePoint サイトの基本的な操作や用語が理解できている方で、Power Automate や Power Apps を使った業務改善などを検討している方です。

SharePoint Onlineでは組織全体で使用する Office テンプレート ファイルを集中管理できます。これには「組織のアセットライブラリ(Organization Assets)」を利用します。

組織のアセット ライブラリについては以前、このブログでも紹介しています。

これを利用することで、デスクトップ版のOffice アプリケーションで新規にファイルを作成する際に、組織名とともにテンプレートが表示されるようになります。残念ながら Web版やモバイル版では利用できません。

組織のアセットライブラリ - Office Templates

このテンプレートは SharePoint Online の全体管理者が指定したSharePointのドキュメントライブラリから取得しています。つまり、デスクトップ版のOffice アプリケーションにサインインするときに指定したアカウントに紐づく SharePoint 上のアセットライブラリが自動的に取得されるということです。PC を入れ替えてもいつでも組織のテンプレートを利用できるということです。また、テンプレートの管理は一般的な SharePoint のドキュメント ライブラリであるため、ファイルのアップデートも簡単です。

なお、このライブラリにテンプレートをアップロードするときには、必ずテンプレートファイル形式でファイルを保存する必要があります。PowerPoint であれば *.potx です。

ところで、大事な設定方法ですが、管理者はテンプレートを格納するライブラリを組織のアセットライブラリとして指定するには次のPowerShellコマンドを実行する必要があります。-OrgAssetType を OfficeTemplateLibrary に設定するところがポイントですね。

#変数

$LibraryUrl="https://<アセットライブラリに指定したいライブラリのURL>"
$OrgAssetType="OfficeTemplateLibrary"
$CdnType="Private"

#組織のアセットライブラリの設定
Add-SPOOrgAssetsLibrary -LibraryUrl $LibraryUrl -OrgAssetType $OrgAssetType -CdnType $CdnType
2020年4月10日 (金)

Microsoft Teams の管理者向けの情報です。

Microsoft Teams のオンライン会議では会議のオプションを指定できるようになっていますが、5月の第1週から、Teams の管理者はこのうち「発表者となるユーザー」の既定値を変更できるようになるようです。

会議のオプション

基本的な使い方は以前公開している下記の記事を参照してください。

関連記事 : Office 365 を活用したテレワークについて vol. 3

現状の既定値は次の通り。

  • ロビーをバイパスするユーザー : 自分の組織内のユーザー
  • 発表者となるユーザー : 全員

このうちの「発表者となるユーザー」設定を、テナント全体の設定として既定値を変更できるようになる機能が現状開発段階に入りました。2020/4/6 にMicrosoft 365 ロードマップに次の機能が開発中のステータスとして追加されています。

https://www.microsoft.com/en-us/microsoft-365/roadmap?filters=&searchterms=63206

Roadmap_63206

日本語で要約します。

テナントの管理者は、会議ポリシーを使って「誰が発表者になれるか」についての既定値を変更できるようになる。最初は PowerShell コマンドで設定することになるが、すぐに管理ポータル上から構成できるようにする。5月の第1週からロールアウトを開始予定。

2020年4月 3日 (金)

Power Automate を使ってリスト内のアイテムを一気に他のリストに移動させたいということもあります。しかし、残念なことに、SharePoint Designer で開発するワークフローには存在していた「アイテムのコピー」というアクションは SharePoint コネクターにはありません。

一つ断っておくとすると、SharePoint Designer での開発はサイトを越えた処理は基本的にはできず、SharePoint REST API を使うなどしていましたので、もともとそう高機能だったというわけでもありません。

話を戻しましょう。

Power Automate の場合は元のアイテムのデータをもとに新しいリストにアイテムを新規に作成するという、コピー作成を行うことになります。「移動」にしたければ最後にアイテムを削除すればよい。

まずは機能検証するためにコピーまでとし、元のリストアイテムの削除はしません。これを実現する最も手軽な方法は、次の SharePoint コネクターのアクションを使うことです。

  • 複数の項目の取得 (Get items)
  • 項目の作成 (Create an item)

さて、複数のアイテムがあるのでこれを一気にコピーしたいのですが、とりあえず手動でフローをトリガーしてやることにします。処理が終わったらMicrosoft Teams にチャットメッセージを投稿するようにします。以上を踏まえると以下のようなフローの組み立てがシンプルです。

Bulk List Item Copy 1

さて、フローをテスト実行し、手動開始してみます。今回、元のリストには1,000件以上のアイテムがあります。が、試すと Apply to each では 100件までしか処理していないことが分かります。

Bulk List Item Copy 2

さて、なぜこうなっているのか? 

昔から SharePoint の一括操作(バルク処理)は100がしきい値というのはおなじみのところであり、SharePoint の API もクエリを使って取得するデータの上限は既定値が 100 というのもよくある話。さて、これはどこの設定が関わっているのか確認してみましょう。

先ほどの「複数の項目の取得」の詳細オプションを確認すると「上から順に取得」という項目あります。英語だと Top Count という項目です(英語の方が分かりやすい...)。SharePoint の開発をしたことのある方なら、ここでピンとくるかもしれません。これが要はREST API の引数の $top に当たるわけです。これが既定値のままだと、100アイテムを取得するという既定の動作となるのです。

Bulk List Item Copy 3

この値を2000ほどに変更しておくと、今度は1,000件以上のアイテムが取得できました。

Bulk List Item Copy 6

なお、「上から順に取得」で指定できる上限は SharePoint は一度の呼び出しで最大  5,000までしか取得できません。

そして このアクションのあとに Apply to each を使用しますが、 Office 365 およびフリーのライセンスでは5,000までしか対応していません。これ以上の値を指定したい場合は Power Automate per flow または per user (もしくは Plan2 か Plan1)が必要になります。有料プランであれば上限は100,000 になります。

このことについては詳しくは下記に記載されているので一度目を通しておきましょう。

さて、5,000以上指定したい場合は、上記のライセンスを持っているのであれば、「複数の項目の取得」アクションの設定から、改ページ (Pagination) のしきい値をたとえば20,000などに指定します。

Bulk List Item Copy 4

Bulk List Item Copy 5

改ページをオンにすることで、しきい値の指定がなければすべてのアイテムを、もしくはしきい値があればその値に達するまで呼び出しを続けるようになります。「改ページ(Pagination)」に関しては次のブログに記載されています。

Do Until の利用

ところで Power Automate per user や per flow などの有料プランを持っていない場合に対処方法はあるのか?

Do Until を使う方法であれば、これをクリアできそうです。たとえば、上限である5,000アイテムずつ繰り返し取得して行くというアプローチが取れるようになります。ただし、フローは若干、複雑になります。

まず変数の準備。次のように変数を用意します。

Bulk List Item Copy 7

次に Do Until を挿入します。条件は ItemEmpty が true になるまで。

あとはこのコンテナの中に「複数の項目の取得」アクションと「項目の作成」アクションを挿入します。

Bulk List Item Copy 8

「複数の項目の取得」アクションの設定で改ページをオンにします。しきい値は5,000にしておきます。

Bulk List Item Copy 9

また「複数の項目の取得」アクションのフィルター条件に TargetItemID の値以上を指定します。

Bulk List Item Copy 10

Do Until コンテナ内の処理の続きとして条件を指定します。

Bulk List Item Copy 11

条件は「empty(body('複数の項目の取得')?['value'])」が true です。

「はい」のときは ItemEmpty を true に設定し、「いいえ」のときは TargetItemIDの値に「複数の項目の取得」アクションで取得した最後のIDを格納します。式は次の通り。

last(body('複数の項目の取得')?['value']).id

このIDを使ってスライディングウィンドウを作るイメージです。

全体像は次の通りです。

Bulk List Item Copy 12

謝辞および参考資料

Power Automate を使って SharePoint のアイテムを一括で処理するところで悩んでいたところ、それを Twitter でつぶやいたら Yellow11(@br_Yellow11) さんが助け舟を出してくださいました! 

Do Until の利用か! なるほど、と思い、いろいろと調べていたところ、細かいところが分かったので、忘れないうちに記事にしようと思い立ったわけです。

また、海外の方が書かれている下記の記事も見つけることもでき、これを含めて今回の日本語の記事にまとめました。

How to get more than 5000 items from SharePoint Online in Flow

皆さんのおかげです

Pay it forward !!