からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

Power Automate と Adaptive Cards で勤怠連絡アプリを作ってみる

Microsoft Teams と Power Automate を Adaptive Cards で連携させてみたかったので勉強がてら勤怠連絡アプリを作ってみました。

全体像はこんな感じ。毎日 9 時にタイマーで起動して Microsoft Teams のチャットに Adaptive Cards を投稿し応答の結果を Excel ファイルに保存します。名前を変えてしまったのでわかりにくいですが Microsoft Teams に投稿するのは「アダプティブ カードを Teams ユーザーに投稿して応答を待機」というアクションです。

f:id:karamem0:20200707103523p:plain

Adaptive Cards は Designer で作成します。ラジオ ボタンで選択した結果を Submit することで Power Automate に結果が返ってきます。

f:id:karamem0:20200707103637p:plain

実際に実行してみます。Microsoft Teams のチャットに Adaptive Cards が送られてきます。

f:id:karamem0:20200707104628p:plain

回答するとカードが更新されます。

f:id:karamem0:20200707104733p:plain

結果は本文の data に入ってきますので body('{{アクション名}}')?['data']?['{{ID}}'] のような式で後続のアクションから選択された項目を取得することができます。

f:id:karamem0:20200707104822p:plain

結果が Excel に登録されているのがわかります。

f:id:karamem0:20200707105120p:plain

例えばチーム内で勤怠管理するくらいならこれで十分な感じがありますね。

Microsoft Teams でアプリ バーに表示されるアプリのピン留めを組織で固定する

Microsoft Teams の左側にあるアプリ バーは個人で任意のアプリをピン留めすることができますが、組織として特定のアプリを使ってもらいたい場合、ポリシーとして組織全体または任意のユーザーに対して展開することができます。これは Microsoft Teams 管理センターで行います。

Microsoft Teams 管理センターの [Teams のアプリ] - [セットアップ ポリシー] で任意のポリシーを選択します。[ピン留めされたアプリ] にアプリを追加することで、アプリ バーのアプリを追加することができます。試しに Yammer のアプリを追加して一番上に表示させるようにします。

f:id:karamem0:20200623142256p:plain

反映には最大 24 時間かかるそうなので気長に待ちましょう。うまくいくとアプリ バーのところに [コミュニティ] というアプリが追加され、Yammer を Microsoft Teams のタブとして表示することができます。Yammer と Microsoft Teams は機能が似ているので、Microsoft Teams を使っていると Yammer の利用率が下がってしまうことがあるのですが、これによって Yammer の利用を促進することができると思います。

f:id:karamem0:20200623142814p:plain

組織で展開しているカスタム アプリもピン留めできますので、組織として使ってもらいたいアプリを固定することで、Microsoft Teams をより進化したポータル アプリとして使ってもらえるようになると思います。

SharePoint Framework で共通のプロパティを利用する

SharePoint Framework ではテナントまたはサイト コレクション単位で共通の読み取り専用のプロパティを使用することができます。

docs.microsoft.com

値の設定は Office 365 CLI または PnP PowerShell を使って行うことができます。SharePoint Framework では REST API または pnpjs を使って値を読み取ることができます。

実際に試してみたいと思います。まずは PnP PowerShell でプロパティを追加します。

Set-PnPStorageEntity -Key "Copyright" -Value "Copyright (c) 2020 karamem0"

確認のために PowerShell で REST API を呼び出します。*1

Invoke-WebRequest -Uri "https://{{tenantname}}.sharepoint.com/_api/web/getstorageentity('Copyright')" -Method Get -Headers @{ "Accept" = "application/json"; "Authorization" = "Bearer eyJ0eXAi..." } | select -ExpandProperty Content

結果として JSON が取得できます。

{
  "odata.metadata": "https://{{tenantname}}.sharepoint.com/_api/$metadata#SP.ApiData.StorageEntitys/@Element",
  "odata.type": "Microsoft.SharePoint.ClientSideComponent.StorageEntity",
  "odata.id": "https://{{tenantname}}.sharepoint.com/_api/web/getstorageentity('Copyright')",
  "odata.editLink": "web/getstorageentity('Copyright')",
  "Comment": null,
  "Description": null,
  "Value": "Copyright (c) 2020 karamem0"
}

内部実装としてはテナントのアプリ カタログ サイトまたはサイト コレクションのアプリ カタログ サイトの Web.AllProperties の storageentitiesindex に JSON 形式で値が格納されます。SharePoint Framework では他のサイト コレクションのデータを読み込むことはできませんが、getstorageentity のメソッド呼び出しにより読み込むことができるようになります。テナントとサイト コレクションで同じキーの設定がある場合はサイト コレクションが優先されるようです。

SharePoint Framework のアプリケーション カスタマイザーなどの拡張機能では読み取り専用のプロパティを持つことができますが、プロパティは埋め込まれているため、値を変更するためにはデプロイを行う必要があります。テナントのプロパティとして持っておけば変更が簡単になると思います。

*1:メソッド呼び出しなのに GET なのが気持ち悪いですね。POST でもできますけど。

SPClientCore 3.10.0 を公開しました

SPClientCore 3.10.0 を公開しました。

SPClientCore は PowerShell Core 向けの SharePoint Online 管理モジュールです。

www.powershellgallery.com

ドライブおよびクライアント コンポーネントのプロパティに関するコマンドレットを追加しました。
ドライブについては Microsoft Graph の Drive API で取得できるものと同じものになります。

提供されているコマンドレットの数は 265 になりました。

SPFxCalendar 1.4.1 を公開しました

SPFxCalendar 1.4.1 を公開しました。

SPFxCalendar はモダン UI で予定表リストをカレンダー表示するための Web パーツです。

github.com

変更点は以下の通りです。

  • イベントの編集ができるようになりました。ただし繰り返しイベントには対応していません。
  • 複数の日にまたがるイベントが正しく表示されるようになりました。