Oh! 365 blog

主に SPO や Teams に関する情報を発信しています。

【Teams】トレーニングリソース

今日は Teams のトピックです。最近、Teams の学習用、トレーニング用リソースが無くて困っているという話を聞くことがあったので、日本語でも利用できるソースをいくつか紹介します。本記事は、どちらかというと管理者やヘルプデスクの方々寄りの話になるかと思います。

Microsoft Teams のアーキテクチャを把握したいとき

Micorosft 365 はマイクロサービス化された個々のサービスが密接に連携しているため、他の 365 サービス (SharePoint Online や OneDrive for Business、Exchange Online または Stream など) の話が出てくる機会が多くあります。何か新しいことを学習するときなど、全体像を把握したいときってありますよね。Teams の全体的なアーキテクチャをざっと知りたい場合は、下記公式記事の Teams のアーキテクチャを図解したポスターがおすすめです。

 

docs.microsoft.com


この記事では、下記のようなポスターが閲覧できます。また、PDF や VISIO ファイルとしてもダウンロードすることも可能です。技術者向けの内容ではなく、非技術系の方にも取っつきやすい資料かなと思いますので、おすすめです。

f:id:keisuke-blog:20200504213559p:plain

記事の抜粋

ビデオ トレーニン

Teams は様々なサービスの Hub であり、ミュニケーションの基盤となります。そのため、チャットや Web 会議、ファイル共有に、編集、予定管理、などなど本当に多機能です。公開記事の docs などを流し読みしていくのもいいと思いますが、文字だけだと退屈になるかもしれません。そんな時は、下記ビデオの資料をお勧めします。1 つのトピックについて数分のビデオで機能を紹介します。

support.office.com


管理センターの操作などはほとんどないので、エンドユーザー向けだと思います。この資料を見つつ、実際にアプリを触っていけば、だいたいの機能は把握できるかと思います。このシリーズは他の製品版もあり、私の場合は、製品をほとんど知らない新入社員や中途入社の方の自学用の資料としてよく使っています。

Microsoft Learn


Microsoft は、各サービス向けの学習用リソースをまとめたサイトを公開しています。これもとてもおススメです。検索ボックスがあるので、例えば、Teams というキーワードで絞ると、Teams に関連した学習用資料がでてきます。

docs.microsoft.com


複数のセクションをまとめて、一つのラーニングパスとして設定してあります。各セクションはすきま時間でできるような分量なので、コツコツ進めるのに向いているかなと思います。また、理解度チェックのための Q&A があったりと割と楽しく学習できます。Microsoft アカウントでサインインすれば、これまでに閲覧した資料の履歴が確認できます。

なお、上記学習リソースは、Microsoft の認定試験の学習範囲に対応していることがあります。Teams にも専用の認定試験がありますので、一つのモチベーションとしてこちらを目指すのも良いかもしれません。

docs.microsoft.com

おわりに

昨今の社会情勢を受け、Web 会議ツールの需要が急増していますね。最近下記ニュースを受けた驚愕しましたが、Teams の DAU (Daily Active User) が7500 万人を突破したようです。(Office 365 Business 全体だと 2 億 5800 万人という数字も驚き)

教育機関向けの Education の話はなかったので、それらを含むとさらに伸びるのでしょう。

venturebeat.com

In Q3 2020, Microsoft passed 258 million monthly active Office 365 business users (up from 200 million) and 75 million daily active users for Teams.


少し前に 1300 万 DAU Slack に並んだというニュースも記憶があったはずなので探してみると、2019 年 7 月に記事が出てましたね。Office 365 が増えればおのずと Teams の利用も増えるのでしょうが、この勢いは凄まじいですね。

jp.techcrunch.com

 

昨今の社会情勢を受け、急遽 Teams の利用を開始した方々もいらっしゃることと思いますが、この記事が何かの役に立てば幸いです。ブログを開設した当初は、SharePoint Online メインに関わっていましたが、現在は Teams を扱う機会がほとんどなので、Teams の記事が増えるかもしれません。

 
今回の投稿は以上です。

【SPO】Set-SPOSite のグループサイトコレクションに対する制限事項と PnP を使用した回避方法

グループサイトコレクション (Office 365 グループに関連づいたサイトコレクション) に対して Set-SPOSite コマンドを使用してプロパティを変更する場合、変更可能なプロパティに制限があります。

以下のようなエラーが出た場合は、本記事を参考にしてください。

Set-SPOSite : https://contoso.sharepoint.com/sites/testsite is a Groups site collection. The valid parameters for this type of site collection are...

例えば、Teams で新しいチームを作成した場合、Office 365 グループとチーム、および、Office 365 に関連づいたサイトコレクションがプロビジョニングされます。このグループサイトコレクションの設定を Set-SPOSite コマンドを使用して変更しようとした場合に、プロパティによってはコマンド実行時にエラーが発生します。回避方法は、CSOM や PnP モジュールする方法となります。

エラーについて


実際に変更不能なプロパティを指定して Set-SPOSite コマンドを実行すると、以下のようなエラーが発生します。

Set-SPOSite : https://XXXXXX.sharepoint.com/sites/XXXXXX is a Groups site collection. The valid parameters for this type of site collection are '-Identity', '-AllowSelfServiceUpgrade', '-DefaultLinkPermission', '-DefaultSharingLinkType', '-DenyAddAndCustomizePages', '-DisableCompanyWideSharingLinks', '-DisableSharingForNonOwners', '-LockState', '-Owner', '-ResourceQuota', '-ResourceQuotaWarningLevel', '-SandboxedCodeActivationCapability', '-SharingCapability', '-ShowPeoplePickerSuggestionsForGuestUsers', '-StorageQuota', '-StorageQuotaReset', and '-StorageQuotaWarningLevel'.

列挙されているプロパティのみが変更可能なプロパティを示します。エラーメッセージで検索すると Github にフィードバックされており、制限事項であることが言及されています。

フィードバックがいくつか報告されたため、Github のドキュメントにもグループサイトコレクションに対して有効なパラメータの記載があります。


対処方法

PnP コマンドを使用する手順を紹介します。

SPO 用の PnP モジュールが未インストールの環境の場合はモジュールをインストールします。

Install-Module SharePointPnPPowerShellOnline

例えば、Microsoft Automate (旧 Flow) や Power Apps などの有効化/無効化したい場合は以下のようになります。

# URL を指定して接続します。
Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/365groupsite -Credentials (Get-Credential)


# サイトのコンテキストを取得します。
$clientcontect = Get-PnPContext


# 変更したいサイトのプロパティを指定します。
$clientcontect.Site.DisableAppViews = $true;
$clientcontect.Site.DisableFlows = $true;

 

# ExcuteQuery を実行します。
Invoke-PnPQuery


おわりに


PnP のコミュニティが活発に開発を進めてくれているおかげで、本当に簡単になりました。上で使ったコマンドのリファレンスを以下に紹介しておきます。

docs.microsoft.com

docs.microsoft.com

余談ですが、今回使用した Invoke-PnPQuery コマンドをたどっていくと、PnP Core の ExecuteQueryRetry メソッドが使用されていました。

github.com

docs.microsoft.com

リトライ処理や待機時間の指定などができるようですが、Retry-After の値を考慮した実装ではないようです。多くのサイトコレクションに対して一括で処理したいなどの場合は、スロットリングに対応するベストプラクティスに従って、応答ヘッダから Retry-After の値をとるようにした方がベターだと思います。PnP プロジェクトはオープンソースであり、ソースコードもすべて公開されているので、興味があれば実装を見てみると楽しいですよ。

今回の投稿は以上です。

【SPO】SharePoint Online のサイト URL リネーム機能を使用する

MC193275 で通知されていた SharePoint Online のサイト URL のリネーム機能が使用できるようになっていました。Admin Center と PowerShell の両方で使えるようになっていたので、今回は PowerShell の方法を試してみました。

それでは内容に進みましょう!


1. サイトリネーム機能について

まず、この機能は以下の番号でメッセージ センターよりアナウンスされています。


MC193275 : SharePoint Site URL Rename

 

背景としては、ユーザーが直接開発部門へのフィードバックが可能な、UserVoice に下記アイデアが投稿された結果、多くのユーザーから Vote を集めたことで開発に至った機能のようです。4000 Vote 以上集めてますね

Enable renaming the site collection URLs – SharePoint Experiences in Office365 and/or SharePoint Server

 

ユーザーのフィードバックを重視する姿勢はうれしいですね。
この機能は 2019 年 10 月末を目途に全テナントへの展開が完了する予定のようです。既に関連した公式記事も公開されているため、本記事は公式記事を参照しつつまとめます。

2. Start-SPOSiteRename コマンドを使用したサイトのリネーム
 

本機能は新しい UI のSharePoint 管理センター、および、PowerShell のコマンドで実施できます。

画面操作で行う場合

新しい SharePoint 管理センターの、以下の [編集] という箇所から行います。

f:id:keisuke-blog:20191101124129p:plain

 

PowerShell で行う場合

SharePoint 管理シェルのコマンド Start-SPOSiteRename を使用します。

 
使用例
※ テナント名は適当に cotoso に置き換えています。

- 元のサイト URL

https://contoso.sharepoint.com/sites/oldsite01

- リネームする URL

https://contoso.sharepoint.com/sites/renamesite01

 

コマンド

Connect-SPOService -url https://contoso-admin.sharepoint.com
Start-SPOSiteRename -Identity https://contoso.sharepoint.com/sites/oldsite01 -NewSiteUrl https://contoso.sharepoint.com/sites/renamesite01


これで 終了です。変更が終わると、https://contoso.sharepoint.com/sites/oldsite01 にアクセスすると、https://contoso.sharepoint.com/sites/renamesite01 にリダイレクトされるようになります。

3. 注意点

この機能の使用例として、本来つけるべき URL をタイポしてしまった場合などに、本来付ける予定だった URL に修正するような場面を想定しているようです。もし、古い URL を再利用し、新しいサイト作成しようと考えている場合は、事前に古いサイトコレクションを削除する必要がある点に注意が必要です。

調べたところこの機能は内部的に以下のような動作となるようです。

  •  既存のサイトを 1 つ指定し、リダイレクト先として新しい URL を指定する
  • 指定した新しい URL のサイト (サイト コレクション) が作成され、既存コンテンツが移動される
  • 既存のサイトは読み取り専用のリダイレクト サイトとマークされる
  • リダイレクト サイトとマークされた既存のサイト URL が要求されたとき、サーバー側で新しいサイト URL へリダイレクトする

上記のような動作により、古い URL を要求したとき、そのサイトがリダイレクトサイトとしてマークされていたら、新しい URL へリダイレクトするようです。既存の URL が上書きされるわけではなく、既存のサイトはリダイレクトサイトという特殊なサイトとして存在し続けます。

そのため、仮に古い URL で新しいサイトコレクションを作ろうとすると競合します。厄介なことに、確認する限りリダイレクトサイトとしてマークされた古いサイトは、 SharePoint 管理センターの UI には出てこないようです。つまり、既存のサイト URL と同じサイト URL の新規サイトを作成するような場合は、Remove-SPOSite コマンドを使用し、既存のサイトをコマンドを使用して削除する必要があるということです。


このことは以下の公開情報に記載されています。

docs.microsoft.com

ちなみに、古いサイトを Get-SPOSIte で取得すると、記事にもかいてあるように、読み取り専用、かつ、リダイレクトサイトという特殊なテンプレート (RedirectSite#0) が使われていることがわかります。

f:id:keisuke-blog:20191101125843p:plain


以下の黒いブログによると、古いサイトを削除しないままその URL を使ってサイトを作ることもできるようですが、末尾に 01 のような通し番号が付けられるようです。そのまま使えるのかは不明ですが、おそらく想定していないと思うので、公開記事に沿って削除してから使うほうが賢明だと思います。

art-break.net


その他、各 Office 365 サービスを含む、注意点や影響などは下記公開情報にまとめられているのでチェックしてみてください。

https://docs.microsoft.com/ja-jp/sharepoint/change-site-address#effects-of-changing-a-site-address


2013 形式のワークフローを使用している場合は、サイトのアドレス変更後に再発行が必要となったりするようです。

 

4. おわりに

最近は UserVoice や PnP のコミュニティなど、ユーザーからのフィードバックを重要視していますね。とても素晴らしい試みだと思います。最近はすっかりブログ更新を止めていましたが、アウトプットを継続するために、更新を再開していきます。面白いことに、2 年前に書いた Flow の記事がいまなお多くの方にアクセスされているので、Flow はとても関心が高いのだなと感じています。次回は Flow の記事にしようかと思います。

mountfuji.hatenablog.com

 

また、最後になりますが、11/23(土) に開催される下記イベントにも、"SharePoint Framework で Teams タブ開発" というセッションの、ハンズオンスタッフとして参加します。多くの方々と交流し、新しいアイデアを蓄えてきます。

connpass.com

 今回の投稿は以上となります。

【SPO】PnP ライブラリを使用して SharePoint Online のスクリプトをモダン認証 (先進認証) に対応させる方法


PnP のライブラリを使用して、SPO に対する CSOM 実行をモダン認証に対応させる方法をまとめます。

SPO で、レガシー認証をブロックする設定とした場合、SharePointOnlineCredentials クラスの認証を使用したスクリプトもブロックされます。
管理センターでは、この設定です。
 

f:id:keisuke-blog:20190628140819p:plain

SharePoint 管理センターの設定
SharePoint Online 管理シェルを使用する場合は、LegacyAuthProtocolsEnabled プロパティが該当します。コマンドからの変更はこちらです。 Set-SPOTenant
 
SharePointOnlineCredentials クラスは、CSOM スクリプトの認証として使用されるため、CSOM スクリプトを実行する場合、モダン認証に対応した認証方式に変更する必要があります。

 

0 個の引数を指定して "ExecuteQuery" を呼び出し中に例外が発生しました: "Cannot contact web site 'https://contoso.sharepoint.com/' or the web site does not support SharePoint Online credentials.

 

対処方法

 

モダン認証を使用した認証方法への変更として、最も簡単と考えられる方法は、PnP ライブラリの AuthenticationManager クラスの GetWebLoginClientContext メソッドを使用する方法です。
必要な対応は、PnP Core のライブラリを読み込むことと、数行のコード変更です。
サンプルコードは下記 Microsoft の開発チームのブログでも紹介されています。

blogs.technet.microsoft.com

 

 

注意点

注意点として、この方法は実行の度に資格情報を入力するダイアログが表示されるため、バッチ処理などの無人実行のスクリプトには対応できません。
無人実行のためのスクリプトをモダン認証に対応させるには、Azure AD 上に作成したサービス プリンシパル (アプリ用の実行アカウント) を使用した証明書認証などが必要となります。
(次回はここの内容を書こうかと思います。)


手動で実行しているスクリプトであれば、GetWebLoginClientContext メソッドへの置き換えが簡単かと思います

以下にサンプルを示して終わります。

サンプルの紹介


事前準備として、
SharePointPnPPowerShellOnline をインストールします。

NuGet を使う方法や、zip ファイルをダウンロードして任意のディレクトリに展開する方法もありますし、PowerShell 5.0 以降では下記コマンドでモジュールのインストールが可能です。

Install-Module SharePointPnPPowerShellOnline

インストールしたモジュールを呼び出す場合は下記コマンドです。

Import-Module SharePointPnPPowerShellOnline


以下呼び出しのサンプルコードです。 

 
従来の SharePointOnlineCredentials クラスを使用し、サイト名をコンソールに表示するサンプル

$siteUrl = "https://contoso.sharepoint.com/sites/site01";
$username = "admin@contoso.onmicrosoft.com";
$password = "password";
$secpass = convertto-securestring $password -AsPlainText -Force


$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $secpass);

$clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)
$clientContext.Credentials = $credentials

$clientContext.Load($clientContext.Web)
$clientContext.ExecuteQuery();

Write-Host $clientContext.Web.Title

 

AuthenticationManager クラスの GetWebLoginClientContext メソッドに置き換えた例


$authManager = new-object OfficeDevPnP.Core.AuthenticationManager;
$clientContext = $authManager.GetWebLoginClientContext($siteUrl);

$clientContext.Load($clientContext.Web)
$clientContext.ExecuteQuery();

Write-Host $clientContext.Web.Title
実行時に資格情報を入力するダイアログが表示されるので、ID と パスワードを入力する必要があります。
おわりに

PnP のライブラリやコマンドは、どんどん開発が進んでいて、ほんとに便利になっています。CSOM で一から実装しなくとも、大抵 PnP 側で用意されていることが多いです。不具合報告などは直接コミュニティに問い合わせる必要がありますが、ぜひたくさん使って、フィードバックしていきましょう。

CSOM モジュールのパッケージ管理や PnP コミュニティについては、下記記事をご参考ください。

mountfuji.hatenablog.com

mountfuji.hatenablog.com

 

【SPO】SharePoint の開発コミュニティ (PnP) & ツールの紹介

今日は SharePoint の 開発者コミュニティ (PnP) とコミュニティで紹介された個人的に役立ちそうなツールを紹介します。

コミュニティについて

SharePoint には、開発者向けのコミュニティ (SharePoint Pattern & Practice) 通称、SharePoint PnP があります。
SharePoint 管理シェルで扱えるテナント管理者向けのコマンドよりユーザーに扱いやすくしたコマンドの開発/公開や情報公開を行っています。

docs.microsoft.com

日本のサポート部門のフォーラム投稿にも位置づけが記載されていますね。
https://social.msdn.microsoft.com/Forums/ja-JP/f19d79d3-c6e4-4914-9a8b-580c5efdbf9e/sharepoint-pnp?forum=sharepointsupportteamja


この PnP ですが、Microsoft が主導するオープンソース コミュニティであり、コミュニティメンバーには Microsoft の Dev も含まれています。
PnP コマンドレットなどは、既に広く浸透しており、多くの方が扱ったことがあると思いますが、開発に役立つ Tips やデモ動画が YouTube に公開されているのをご存じでしょうか?

上述の公開記事ページにもリンクがあるのですが、下記チャンネルです。

www.youtube.com

※ 現在 1 万人程度の方がチャンネル登録しているようです。

この YouTube チャンネルでは、数人のメンバーが会話形式で情報を紹介し合うのですが、Microsoft 公式の記事のみならず、海外の MVP の方のブログ記事も多く扱われています。
SharePoint Conference などのイベント直後は、ロードマップやアナウンス内容をピックアップしたりと、旬な情報を得るのにもおススメです。
個人的には以下のような点をメリットと感じており、ランチタイムや通勤時間に流し見しています。

  • 開発のための機能や生産性向上のためのツールが集約されている
  • 海外の MVP の記事の紹介や Twitter などを知れる (新たな情報のチャネルが広がる)
  • 開発者向けの新しいトピックが収集できる

どんな内容を扱っているかに興味があれば実際に見ていただきたいのですが、最近見た動画で、個人的に使えそうだなと思ったツールを紹介して終わります。
元動画は下記回の動画です。

SharePoint Dev Weekly - Episode 40 - 21st of May 2019 - YouTube

ツールの紹介

SharePoint のプロパティを構造ツリーで表示するツール (SharePoint Client Browser)

github.com

こんなツールです。

  • 海外の MVP が作成
  • テナント、サイト コレクション、サイト、リスト、アイテムをツリー構造で表示可能
  • 各スコープのプロパティや内部名を表示可能
  • SharePoint 管理シェルから確認できない、サイトやリストのスコープでプロパティが参照可能
  • SharePoint Online / オンプレミス (2010 ~ 2019) に対応

テナントレベルやサイトコレクション スコープのプロパティは、SharePoint 管理シェルのコマンドから簡単に取得可能です。
しかしながら、管理シェルで扱えるコマンドはサブサイトやリスト、アイテムレベルのプロパティは参照できず、REST API や CSOM、PnP コマンドレットを使用する必要があります。

この SharePoint Client Browser は、下記のように、SharePoint のオブジェクトモデルのままツリー表示してくれます。

f:id:keisuke-blog:20190616224939p:plain
サイトテンプレートのプロパティを参照

f:id:keisuke-blog:20190616225058p:plain
アイテムのプロパティも参照可能

テナントやサイト コレクション、サイト、リストレベルの設定値の確認や、内部名などを確認したい場合は使えそうです。
開発用のテナントを使用した検証などにも効果を発揮しそうです。

インストール方法や使い方は GitHub のページに記載がありますが、ほとんど見なくてもよいくらい直感的です。
プロパティによっては MSDN の記事もアプリ内に表示され、かなりいいです。

※ インストールは不要ですが、不明な発行元と表記されるため、もしかしたら会社のポリシーによってはブロックされるかもしれません。

SharePoint REST API で使えるメソッドを検索する Web ツール (SharePoint REST API Metadata Explorer)

s-kainet.github.io


SharePointAPI は、製品の構造と API の構造が対応づくように開発されているオブジェクトモデルです。
そのため、オブジェクトやメソッドの名前が容易に想像でき、慣れている方であればわざわざ検索する必要もないかもしれませんが、REST API をあまり使わない方には重宝するかもしれません。
Web サービスであり、ファイルのダウンロードなどは不要です。
操作も簡単なので、実際に使ってみてください。

なお、常に最新の API 情報を提供するために、Azure Function を利用して 1 日/回 SharePoint REST APIスキーマを /_api/$metadata から取得し、差分があれば更新するというようにしているようです。
いいやり方ですね。

おわりに

昨今の Office 365 はマイクロサービス化が加速し、SharePoint を取り巻く環境も大きく変化しています。
Office 365 ファミリーの Microsoft Flow、PowerApps、Forms に Stream や PowerBI、Microsoft Search など、複数の機能を提供するサービスを組み合わせた無数の使い方があります。
世界中に利用者がいる大規模な Office 365 のサービスを駆使して、次はどんなことができるだろうと考えるのは楽しいですよね。
使い方に困ったときはユーザーコミュニティもありますし、多くの方々がブログを書いていたりと、同じサービスを利用するみんなのために、一人ひとりが何かで貢献しようとする雰囲気はとても好きです。
自分も継続的に発信していこうと思います。

今回の投稿は以上です。

Have a nice O365 life!

【SPO】CSOM と SharePoint Online 管理シェルを PowerShell でパッケージ管理

今回の投稿は SharePoint Online に関連する内容です。

※ 2019/6/28 追記
この記事を書いた後に、TechNet のまとめ記事を見つけたので、この記事にリンクを載せておきます。

blogs.technet.microsoft.com


CSOM と SharePoint 管理シェル (Microsoft.Online.SharePoint.PowerShell) が PowerShellGet から入手可能になったため、PowerShell を使用して両方のモジュールをパッケージ管理できるようになりました!

docs.microsoft.com

使い方はとても簡単なので、是非お試しください!Update-Module コマンドで簡単にアップデートできるようになるので、最新版のモジュールが出たら、一度アンインストールして最新版をインストールするという手間も無くなりますね!

SharePoint 管理シェルのモジュール インストール

Install-Module -Name Microsoft.Online.SharePoint.PowerShell

上記モジュールにより PowerShell 上で SharePoint 管理シェルのコマンドが使用可能です。
自動補完も効くようになります。

CSOM モジュール

Install-Module -Name SharePointOnline.CSOM

上記コマンドでインストールしたモジュールを、パッケージからロードする場合は、下記コマンドを使用します。

Load-SPOnlineCSOMAssemblies または Load-SPOnlineCSOMAssembly

PowerShellGallery のコードを見ると、Load-SPOnlineCSOMAssemblies の一行で、以下 4 つのモジュールがインストール可能なようです。

function Load-SPOnlineCSOMAssemblies
{
Load-SPOnlineCSOMAssembly "Microsoft.SharePoint.Client.dll"
Load-SPOnlineCSOMAssembly "Microsoft.SharePoint.Client.Publishing.dll"
Load-SPOnlineCSOMAssembly "Microsoft.SharePoint.Client.Runtime.dll"
Load-SPOnlineCSOMAssembly "Microsoft.SharePoint.Client.Search.dll"
}

PowerShell Gallery | SharePointOnline.CSOM.psm1 0.1.0

多くの場合は、Load-SPOnlineCSOMAssemblies の一行で済みそうですかね。
上記以外のモジュールを使用する必要がある場合は、Load-SPOnlineCSOMAssembly で個別にロードします。

Install-Module によりインストールしたモジュールは "C:\ProgramFiles\WindowsPowerShell\Modules" に格納され、管理されるようです。

In this example, modules with a name that starts with MyDSC that are found by Find-Module in the online gallery are installed to the default folder,
C:\ProgramFiles\WindowsPowerShell\Modules.
PowerShell

Find-Module -Name "MyDSC*" | Install-Module

Install-Module (PowerShellGet) - PowerShell | Microsoft Docs


PowerShellGet は Windows Management Framework 5.1 含まれており、Windows 10 であれば標準搭載されています。
WFM 5.1 がインストールされていない環境の場合は、以下のリンクよりダウンロード可能です。

https://docs.microsoft.com/ja-jp/powershell/wmf/5.1/install-configure

パッケージ管理については記事を書かれている方がいるので、リンクを貼っておきます。
qiita.com

おわりに

最近 Twitter で以下の記事を見つけたので、今回の記事を書こうと思いました。
blog.karamem0.jp

実際には Nuget で管理している場合が多いと思いますが、PowerShell だけで手軽にパッケージ管理が可能な為、SharePoint Online 管理シェルと CSOM (Client Side Object Model) SDK の共存にお困りの方がいれば、是非お試しください。


1年以上ブログを放置していましたが、活動を再開したので、役立ちそうな情報があれば積極的に記事にしていきます!
2019 年は、OSS プロジェクトである SharePoint PnP コミュニティへの貢献をモチベーションにできたらいいなあと思っています。
2019 年も楽しく活動していきましょう!

今回の投稿は以上となります。

Office 365 の複数アカウント切り替えに便利なブラウザ拡張

今日は Office 365 で複数アカウントの切り替えを伴う検証に便利なブラウザの拡張ツールをご紹介します。Google ChromeFirefox の拡張ツールです。

  

Offie 365 製品の検証をしていると、管理者と一般ユーザーなど異なる権限のアカウントでの検証が必要な場面、あるいは、複数テナントを使用した検証が必要な場面もあるかと思います。

そんなとき、ブラウザの通常モードとプライベートモード、あるいは、異なるブラウザを利用し複数のアカウントを使用する方が多いのではないでしょうか。

今日ご紹介する拡張ツールを使用すると、ブラウザのタブで異なるアカウントを使用できるのでとても便利です!!タブでのアカウント切り替えが可能になると、デスクトップがすっきりするので、作業もはかどります。 


Firefox Multi-Account Containers – Firefox 向けアドオン


このツールがあるため、業務では Firefox を使用しています。このツールがお勧めなところは、タブの色でアカウントを識別可能なところです。どのタブがどのアカウントであるかをタブを開かず判別可能なので、作業効率がかなり上がりました。

実際の画面はこんな感じです。 

f:id:keisuke-blog:20171209143545p:plain

タブの色とアドレスバーに登録した名前も表示されます。私の場合は、ユーザー名 (テナント名) という規則で登録しています。

以下の Gigazine の記事でも紹介されていました。

gigazine.net

 

Google Chrome - openMultiLogin

こちらも基本的な使い方は同じです。メインブラウザが Chrome の方は良いと思います。他にも類似の拡張ツールがありますが、広告が出たりしないので、Chrome で検証する必要があるときは使っています。



毎日業務で Office 365 を触っているので、便利なツールがあればどんどん使って、作業を効率化して、この記事のようなアウトプットの機械を増やしていきたいです。

私は普段以下のOffice 365 製品のサポート業務をしています。
自分の記事の更新が止まっていたところだったので、今回の Advent Calendar が良い機会になりました。Office 365 を盛り上げていく力になれればと思います。

最後までお読みいただきありがとうございました!

【SPO】列の書式設定機能でモダン UI のリスト/ライブラリを手軽にカスタマイズ

SharePoint Online の条件付き書式 (Column Formatting) 機能がテスト テナント使えるようになっていたので、試してみました。

 

公式ページはこちら

Use column formatting to customize SharePoint | Microsoft Docs

補足: 11/13 の時点で、プレビュー版であることが書かれています。

 

 JSON による書式設定を使用したサンプルも公開していますので、こちらもご参考ください。

www.samurainote.com

 

オフィスアイ株式会社のブログでも取り上げられていました。

shanqiai.weblogs.jp

 

SharePoint Online のモダン UI では、SharePoint Framework Extentions によるカスタマイズも可能ですが、コーディング経験がないとかなりハードルが高いです。一方、今回追加された Culumn Formatting 機能は、JSON 形式でクラスの追加やスタイル定義、条件分岐がかけるため、より手軽にリスト/ライブラリの装飾が可能になりました。(ただし、JSON 形式に慣れないと正直なかなかしんどいです。)

 

機能が有効になっているテナントでは、以下のように列名のヘッダ部分から、[この列の書式設定] という項目が追加されています。

 

f:id:keisuke-blog:20171113005119p:plain


指定した列に対して、JSON でクラスを追加し、そのクラスに対してスタイル定義を指定することができます。それにより、Office UI Fabric で提供している定義済みのスタイルやアイコン画像などが利用できます。もちろん、スタイル定義を自分で書くことも可能です。クラシック UI だと、スクリプトエディタやビュー ファイル (AllItem.aspx など) に CSS を埋め込んでいた方も多いと思いますが、モダン UI においても Column Formatting 機能により、標準機能で簡単なカスタマイズができるようになりました。少しだけ試してみてみましたが、なかなか楽しいです。もしこんなことがしたいというアイデアをいただければ、試してみますので、ご意見いただけると嬉しいです。

 

それでは、早速今回試したものをご紹介します。

 

列の値をクリックすると、列の値を検索クエリとして Google 画像検索を行う。

 

1 行テキスト列を作成し、以下のように JSON で定義した内容を貼り付けます。 

f:id:keisuke-blog:20171113012859p:plain

動物の名前をクリックすると、動物の名前で画像検索した結果ページが別タブで開きます。

  href でハイパーリンクを設定する際、operator (演算子) で "+" を選択し、operamds (値と変数) にジャンプさせたい URL  の組みを記述しています。"@currentField" で列の値が使用できるため、規則に従っている URL がある場合、列の値と組み合わせて任意の URL にジャンプさせることができます。


こんな感じです。可愛いですね。

f:id:keisuke-blog:20171113013307p:plain

うさぎの検索結果


 

フォントサイズの変更と、アニメーションの設定。

 次の例は、Office UI Fabric で使用可能な Class のうち、

  • ms-font-xxl (フォントサイズ 28pt)
  • ms-slideRightIn10 (フェードイン)

を使用する例です。と言っても、class 属性に Office UI Fabric のページで見つけた使いたいクラス名を指定するだけです!

f:id:keisuke-blog:20171113015141p:plain

フォントサイズの変更とアニメーションの設定


開発者ツールで DOM を確認すると、sp-field-customFormatter クラス、ms-font-xxl クラスおよび ms-slideRightIn10 クラスが追加されていることが確認できますね。右側でアニメーションのタイミングも確認できます。

f:id:keisuke-blog:20171113015720p:plain

開発者ツール


ここで紹介したのはほんの一例ですので、色々触ってみてください。Role という属性もあるので、これはログインユーザーの権限によって適用するスタイルを切り替えられるということなのでしょうか。まだまだわからないことが多いので、色々触って確かめてみます。JSON の設定は列ごとに行う必要がありますが、フォントサイズの変更など、固定のフォーマットを列全体で一括設定したいということであれば、CSOM を使うことになりますね。 

今回は以下に公開記事の情報と、Office UI Fabric の一例を紹介し、終わります。正式リリース版が出てくれば、クラシック UI からモダン UI への変更が進むかもしれませんね!今後の動向にも期待ですね。




 

 

 <参考情報>

補足: 執筆時点 (2017/11/13) での公式ページ記載の情報

f:id:keisuke-blog:20171113011300p:plain

サポート対象となる列の種類

f:id:keisuke-blog:20171113011528p:plain

使用可能な DOM 要素

f:id:keisuke-blog:20171113011716p:plain

使用可能な属性

 こちらが Office UI Fabric のページ

https://developer.microsoft.com/en-us/fabric#/styles/typography

developer.microsoft.com

以下のようにフォントのサンプルやアイコン画像、アニメーション効果やフォントカラーなどのサンプルがたくさんあります。いい感じに装飾できそうですね!

f:id:keisuke-blog:20171113012314p:plain

Office UI Fabric - フォントのサンプル

f:id:keisuke-blog:20171113012541p:plain

Office UI Fabric - アイコン画像のサンプル



今回の投稿はここまでです。

p.s. 最近は Android アプリ作りにはまってしまい、ブログ更新が止まっておりました。Qiita の Advent カレンダー Xamarin (初心者枠) の 2017/12/10 の回で記事投稿予定です。地道に活動していきます。

qiita.com





 

 

 

Microsoft Flow で Cognitive Service の活用方法を考えてみる

一つ前の記事を公開したところ、Microsoft Flow を業務で利用している使っている友人からコメントをもらうことができ、アイデアが膨らんできたので色々試してみました。

前回の記事はこちら
Microsoft Flow と SharePoint Online で自動採番機能を実装してみた

目的を持って実装するほうが学びも多いと思うので、今後は以下のようなシナリオを仮定し、Flow を使って対応できないかを考えてみます。(何かアイデアがあればやってみるので教えてほしいです!)


利用シナリオ : カスタマーサポート

  1. お客様から問い合わせメールを受信する
  2. 問い合わせメールの記載内容をもとに、Q&A サイトや自社データベースから関連する情報を取得する
  3. 取得した情報を、自動返信メールの本文に記載する
  4. 作成した自動返信メールをお客様へ返信する

 上記のように、第一次受付を完了しましたというような自動応答メールのなかに、回答と思われる情報を記載することで、問題解決を早期化しようという内容です。過去に Line BotBot FrameworkChat Bot を作成した際、いずれ実装しようと思っていた内容ですが、入出力のインターフェースが変わるだけで中身の実行ロジックは同じなので、Flow でどこまでできるかをやってみようと思いました。 Flow はあくまでサービスとサービスをつなぐ Hub という位置づけのサービスですが、可能な限り Flow で提供されているコネクタを利用してやってみます。

本記事で紹介する内容

 今回の記事では、Gmail でメールを受信した際に、本文の内容からキーワードを抽出して出力するところまでを紹介します。今回は、例文として枕草子の冒頭部分を使用しました。

例文

春はあけぼの。やうやう白くなりゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる。

夏は夜。月のころはさらなり、闇もなほ、蛍の多く飛びちがひたる。また、ただ一つ二つなど、ほかにうち光て行くもをかし。雨など降るもをかし。

秋は夕暮れ。夕日の差して山の端いと近うなりたるに、烏の寝所へ行くとて、三つ四つ、二つ三つなど飛び急ぐさへあはれなり。まいて雁などの連ねたるが、いと小さく見ゆるは、いとをかし。日入り果てて、風の音、虫の音など、はた言ふべきにあらず。

冬はつとめて。雪の降りたるは言ふべきにもあらず、霜のいと白きも、またさらでもいと寒きに、火など急ぎおこして、炭持て渡るも、いとつきづきし。昼になりて、ぬるくゆるびもていけば、火桶の火も、白き灰がちになりてわろし。

 解析結果

["降りたる","連ねたる","言ふ","さら","あら","飛び","明かり","火桶","つとめ","紫だち","ころ","山際","急ぎおこし","いけば","果て","山の端","ほか","うち光","夕日","わろし","寝所","夕暮れ","あけぼの"]

 
 本文から取得したキーワードを検索クエリとして、Q&A サイトをスクレイピング、あるいは データベースの検索結果を返すだけでも、それなりのものになるかもしれません。

実際に使用するイメージとして、適当に探した以下のフォーラムの質問からキーワードを抽出してみました。

EdgeでWordpressのログインURLに接続をしたら「このサイトは安全ではありません」と表示される

質問文

EdgeでWordpressのログインURLに接続をしたら「このサイトは安全ではありません」と表示されるのですが、原因が分かりません。

キーワード抽出結果

["接続","ログインURL","Wordpress","Edge","サイト","安全"]

 

キーワードの組み合わせ次第ではいい感じのものを取って来てくれそうな気もします。
今回の記事では、ここまでの処理について紹介していきます。

 

Flow の実装内容

 ここから実際の Flow の実装内容となります。今回は以下のような実装です。

  1. Gmail で本文に枕草子の文章を記述したメールを自分に送信 (手動)
  2. 自分宛にメールが届いたら受信メールの本文を Text Analytics API に渡す。(Flow のトリガー)
  3. 本文から抽出したキーワード群をから出力用配列を作成
  4. 出力結果を OneDrive for Business 上のテキストファイルに出力


今回の実装内容の全体図がこちらです。

f:id:keisuke-blog:20171023234832p:plain

使用したコネクタ

補足
  3. の処理は、キーフレーズの取得結果を OneDrive for Business などのその他のコネクタで扱おうとした際、Apply to Each (Foreach 構文) の中でキーワード一つ一つを処理することしか選択できずハマったため、一度データ出力用の配列として格納することで対応しました。

 

コネクタ内の実装はこちら

f:id:keisuke-blog:20171023235052p:plain

コネクタの内部実装


テキスト解析部分の処理について

 Q&A サイトや自社データベースから関連する情報を 検索 / 抽出 するためには、検索のためのクエリが必要です。受信したメールの本文からキーワードを抽出する処理 (テキスト解析) には、MicrosoftCognitive Service で提供されている Text Analytics API を利用します。Json 形式で文字列を渡すと、渡された文字列からキーワードを 判別 / 抽出 し、結果を Json 形式で返してくれます。

Cognitive Service の記事はこちら

Cognitive Services—インテリジェンス アプリケーション | Microsoft Azure

Text Analytics API  は、コネクタから "テキスト" と入力すれば見つかります。

f:id:keisuke-blog:20171024000209p:plain

Text Analytics API の検索方法

 Flow のコネクタを見ると、Text Analytics API 以外の Cognitive ServiceAPI も利用できるようです。

  • Computer Vision API (画像解析: Image analysis)
  • Emotion API (感情分析:Sentiment Analysis)
  • Microsoft Translator Text API (翻訳)
  • Language Understanding Intelligent Service : LUIS (言語理解)

 特に LUIS でうまく言語を学習させることができれば、 色々な自然言語を汎化して別のトリガーとして使えそうですね。


Text Analytics API 
を含む Cognitive Service を利用するためには、Flow の作成者が Azureサブスクリプションを取得しておく必要があります。API は無料プランが利用できるので動作確認は非課金で大丈夫です!
このあたりは上述した公式ページから追っていけば何とかなるので割愛します。 

本記事の実装で対処していないところ

 今回、メール本文が HTML 形式などのリッチ テキストだった場合、以下のように HTML タグまでキーワードとして取得してしまったため、メール本文をテキスト形式にして送信しています。

HTML 形式のメールの場合

["quot;\\0030d2","0030ce","0030ae","0089d2","0030b4  Pro W3","Meiryo","メイリオ","0030e9","15px","font-size","letter-spacing","color","rgb","font-family","span style","br style","font class","text-decoration-line","gmail-text","underline","降りたる","連ねたる","かし","言ふ","あら","飛び","さら","div dir","明かり","火桶","ltr","紫だち","わろし","山際","急ぎおこし","いけば","果て","山の端","ほか","うち光","夕日","寝所","ころ","あけぼの","夕暮れ","つとめ"]

ここは条件分岐で処理するなど、うまくハンドリングできるよう考えてみます。

今回の記事は以上となります。
次回はスクレイピング or データベースの検索部分をやってみます(できたら)。

 

 

Microsoft Flow と SharePoint Online で自動採番機能を実装してみた

今回は、ドキュメント ライブラリへのファイル アップロードをトリガーに、自動的に採番するよう実装してみました。採番のルールは、アップロード日時 (年 and 月) + アイテムの ID で生成するようにしています。今回はドキュメント ライブラリですが、リストでも同じ要領で実現できると思いますので、ご参考ください。

 

※ 2020 年現在、Microsoft Flow は Power Automate にリブランドされていますが、同じロジックはそのまま利用できます。

例) この記事で実現できる採番の例
実行日が 2017/10/20 で作成したアイテムの ID が  1 の時

2017/10/20 -> 2017101 

SharePoint Online 動作例 (1行テキスト列に採番結果を格納)

f:id:keisuke-blog:20171020112237p:plain


Flow の実装

f:id:keisuke-blog:20171020111915p:plain


実装ロジック

  1. ドキュメント ライブラリにファイルをアップロードする (Flow のトリガー)
  2. ファイルのアップロード日時から、年月の情報を取得
  3. ファイルの ID を取得
  4. 年月の情報とファイルの ID を結合
  5. ライブラリの列に出力する

 
使用した関数と、関数を使用した際に得られる戻り値について

(1) 現在時刻を文字列形式で返す 
  現在の日付を取得する関数として、utcNow() が利用できます。
この関数を使用すると、以下のように日付が文字列形式を戻り値として取得できます。

utcNow() 

出力結果 :["2017-10-17T00:21:57.7273806Z"]

 
(2) 現在時刻から、年と月を取得する準備 
 utcNow() を実行すると、戻り値として、YY-MM-DD:HH:MM:SS という形式の現在時刻が返ってきます。
次に、区切り文字 "-" を引数に、split () を使用します。
split () は、引数として渡した区切り文字で文字列を分割し、Array 型として返してくれます。

split(string, separater)

split(utcNow(),"-")

出力結果 : ["2017", "10" ,"17T00:21:57.7273806Z"]

 

(3) 配列から年と月を取り出す
 split() の戻り値として、Array 型が返ってきました。今回取得したいのは、年と月の要素なので配列の先頭から 2 つ目の要素までを取得します。Array 型から指定した数の要素を返す take() を使用します。

take(array, count)

take(split(utcNow(),'-'),2)

実行結果 : ["2017","10"] 


(4) 配列の要素を結合し文字列として返す
 take () の戻り値として、年と月のみが格納された配列が取得できました。これらの要素を文字列として結合します。結合には join () を使用します。join は、引数として渡した区切り文字で結合する関数ですが、区切り文字を与えない場合は、区切り文字無しで結合してくれます。

Join(array, separater) 

join(take(split(utcNow(),'-'),2),'')

実行結果 : 201710 

 

(5) 年月とファイル ID を結合する。
 取得した年月と Flow が用意している動的なコンテンツの中から ID を選択し、文字列結合します。文字列結合は、concat() を使用します。

concat(string1,string2,....)

concat(join(take(split(utcNow(),'-'),2),''),triggerBody()?['ID'])

実行結果 : 2017101 (年月+ID)

 


本記事で使用している関数は、一般的なプログラミング言語で広く使われている関数です。実際、utcNow() の実行結果を SharePoint Online 上で確認した後は、paiza.io というオンライン エディタ上で動作確認しました。個人的には、関数チェックはエディタで行って、最終確認を SharePoint Online 上でやるという流れが効率的かなと思います。

f:id:keisuke-blog:20171020112659p:plain

paiza.io



 今回の自動採番の方法として、utcNow() の戻り値に対して、substring () により、インデックスを指定して指定した数の文字列を取り出すという方法も検討しました。そうすると、1~9月、10~12月の場合で文字数が変わり、条件分岐させる必要があるので、今回は split () で配列として取得して、要素を操作する方法をとりました。

また、Flow が失敗した際の再送信処理や、エラーハンドリングなどは組み込んでいません。その辺りも今後も試す予定なので、こんなことできるかなってアイデアがあれば教えてください:)