Tech Note

Azure, Office 365, Power Platform, etc... の勉強手記

Microsoft Docs の日本語⇔英語切り替えのブックマーク

Twitter のタイムラインで Microsoft Docs の日本語⇔英語切り替えの話題を目にしたので、私がやってるやり方を書き残しておこうと思います。

ブラウザのブックマークを1つ作って、ブックマークの URL に下記のスクリプトを設定すればOK。

javascript:(function(){e='/en-us/';j='/ja-jp/';if(document.location.href.indexOf(e)==-1){location.href=document.location.href.replace(j,e);}else{location.href=document.location.href.replace(e,j);}})(location.href);

Power Automate で文字列中央にある数値文字を抽出する

abcd123efgh という文字列があったときに、中央にある連続する数値文字 123 を抽出したいケースを Power Automate で考えます。

前提

過去の記事の応用編になります。まずはこちらを参照してください。

shibatea.hatenablog.jp

検討事項

  • 文字列の中から連続する文字を抽出したいので substring 関数が使える
  • 数値文字の先頭インデックスと末尾インデックスが定まれば抽出可能
  • 先頭インデックスの取り方は前提記事を参照
  • 末尾インデックスの取り方は前提記事でやっていたことの逆バージョン
  • つまり indexOf 関数を使ってるところは lastIndexOf 関数を使い、最小値 を取得していたところは 最大値 を取得すればいい

作成した Power Automate

f:id:shibatea:20200610080443p:plain
対象文字列の中央にある連続する数値文字を抽出する

解説

過去記事の差分箇所を解説します。

選択アクションで数値文字の末尾インデックスを取得

f:id:shibatea:20200610081024p:plain

既存の選択アクションをクリップボードにコピーして貼り付けます。(初めてクリップボード機能を使って感動した!)
indexOf 関数を使ってた箇所を lastIndexOf 関数に書き換えるだけ。

アレイのフィルター処理で lastIndexOf 関数の結果を絞り込み

f:id:shibatea:20200610081326p:plain

これも既存のフィルターアクションをクリップボードにコピーして貼り付けてから、差出人 部分を上記の選択アクションの出力に書き換えます。

数値文字の末尾インデックスを取得

f:id:shibatea:20200610081615p:plain

max 関数を用いて、フィルターした結果の配列の中から最大値を取りだします。

docs.microsoft.com

部分文字列を抽出

f:id:shibatea:20200610081759p:plain

取得した数値文字の先頭インデックスと末尾インデックスを用いて、抽出する数値文字の長さを計算します。
末尾インデックスから先頭インデックスを減算した結果に 1 を足すことを忘れずに。

まとめ

Power Automate で文字列中央にある数値文字を抽出しました。
連続する数値文字であればどこでも抽出可能なので、過去記事の拡張版になります。

Power Automate で文字列末尾にある数値文字を抽出する

abcd123 という文字列があったときに、末尾の数値文字 123 を抽出したいケースを Power Automate で考えます。

検討事項

  • 文字列の末尾をまとめて抽出したいので substring 関数を使うのが楽
  • substring 関数を使うには開始位置を定めなければならない
  • 位置(インデックス)を取得するには indexOf 関数や lastIndexOf 関数が使える
  • 数値文字の先頭インデックスが取得できればOK
  • でもどの数値が先頭にくるかわからない
  • だったら全部の数値(0 ~ 9)のインデックスを取得しよう
  • その時の最小値が欲しいインデックス!

作成した Power Automate

f:id:shibatea:20200610002748p:plain
対象文字列の末尾にある数値文字列を抽出する

解説

0 ~ 9 数値配列の定義

f:id:shibatea:20200610003208p:plain

全部の数字(0~9)で indexOf 関数を適用したいので、予め 0 ~ 9 の配列を定義しておきます。

選択アクションで数値のインデックスをまとめて取得

f:id:shibatea:20200610003418p:plain

選択アクションは、配列(アレイ型の変数)に対して 要素の数は変えずに、配列の要素をインプットとして、何かしらの処理を実施する ことができます。
選択アクションについては Qiita に書いたので参考にしてください。

qiita.com

今回のケースで言えば、0 ~ 9 の数字が入った配列を、それぞれの数値で indexOf 関数を適用した結果が欲しいので、選択アクションが使えます。

アレイのフィルター処理で indexOf 関数の結果を絞り込み

f:id:shibatea:20200610004308p:plain

indexOf 関数は、検索文字が見つからない場合は -1 を返却します。

docs.microsoft.com

最終的に、数値文字のインデックスの 最小値 が欲しいので -1 が含まれていると困ります。(必ず -1 が最小になる)
その為、アレイのフィルター処理アクションを利用して、選択アクションの結果から -1 を取り除く必要があります。

数値文字の先頭インデックスを取得

f:id:shibatea:20200610004914p:plain

min 関数を用いて、フィルターした結果の配列の中から最小値を取りだします。

docs.microsoft.com

満を持して部分文字列を抽出

f:id:shibatea:20200610005143p:plain

文字列を抽出する substring 関数がありますが、コネクタとしても用意されていたので今回はそちらを利用しました。
引数は substring 関数と同じです。

docs.microsoft.com

まとめ

データを加工する際に Apply to each を利用すると、思いのほか時間を要する場合があります。
しかし、データ操作コネクタのアクションを使うと爆速で処理されるので、出来るだけこれらを使うように検討すると良いでしょう。

参考

今回は文字列の末尾にまとめて数値文字があるケースですが、数値文字が入り乱れてる場合についてはこちらの記事が参考になると思います。

mofumofupower.hatenablog.com

ReSharper のリファクタリング時にクラスファイルを生成すると文字コードがおかしくなる

環境

問題の事象

Visual StudioC# クラスファイルを作成すると、文字コードUTF-8 with BOM で作れらます。
しかし、ReSharperリファクタリング機能で静的メソッドを移動する際に生成したクラスファイルは、文字コードSJIS になってしまいました。

pleiades.io

再現手順

  • Visual Studio でコンソールアプリケーション プロジェクトを作成します。
  • Program.cs ファイルを確認すると UTF-8 with BOM で作成されます。

f:id:shibatea:20200527043758p:plain

  • Ctrl + R + O ショートカットを利用して、メソッドを新しいクラスファイルに移動させます。

f:id:shibatea:20200527044204p:plain

  • すると、新しく生成された Hello.cs ファイルの文字コードSJIS になります。

f:id:shibatea:20200527044331p:plain

対処方法

調べてみたもののわからなかったのでサポートに問い合わせ予定...

SharePoint リストを CSOM で取得する

SharePoint リスト(カスタムリスト、ドキュメントライブラリ、etc...)を C# の CSOM(Client Side Object Model)で取得します。
今回は特定の SharePoint リストを取得する場合のコードを紹介します。

※ 本投稿は以下の通り、Qiita でも投稿しています。
SharePoint リストを CSOM で取得する - Qiita

環境

※ SharePointPnPCoreOnline は Microsoft.SharePointOnline.CSOM の拡張ライブラリで、便利なクラスや拡張メソッドが提供されています。

サンプルコード

github.com

前提

SharePoint のオブジェクトを取得するためには、その対象オブジェクトを Load してから ExecuteQuery を実行する必要があります。
また、オブジェクトを取得するとき、既定で一部のプロパティにアクセスできません。これらのプロパティにアクセスするためには、プロパティを明示的に読み込む必要があります。

docs.microsoft.com

CSOM メソッド版

CSOM のメソッドで SharePoint リストを取得するためのメソッドは2つあります。
ListCollection クラスの GetById, GetByTitle です。

// using CSOM
var listCsomById = context.Web.Lists.GetById(Guid.Parse("3542cfd9-85b5-4e7d-82fa-7ea70761c0c7"));
context.Load(listCsomById);
context.ExecuteQueryRetry();
Console.WriteLine(listCsomById.Title);

// using CSOM with expressions
// SharePoint リストオブジェクトを取得すると同時に
// 既定でアクセスできない HasUniqueRoleAssignments プロパティを読み込む
var listCsomByTitle = context.Web.Lists.GetByTitle("CsomByTitle");
// 2行で書くバージョン
context.Load(listCsomByTitle);
context.Load(listCsomByTitle, l => l.HasUniqueRoleAssignments);
// 1行で書くバージョン
//context.Load(listCsomByTitle, l => l, l => l.HasUniqueRoleAssignments);
context.ExecuteQueryRetry();
Console.WriteLine(listCsomByTitle.Title);
Console.WriteLine(listCsomByTitle.HasUniqueRoleAssignments);

PnP 拡張メソッド版

PnP の拡張メソッドで SharePoint リストを取得するためのメソッドは3つあります。
CSOM の Web クラスの拡張メソッド GetListById, GetListByTitle, GetListByUrl です。

// using PnP
var listPnPById = context.Web.GetListById(Guid.Parse("f470fb72-1528-45e4-a929-a144146c1b1f"));
Console.WriteLine(listPnPById.Title);

// using PnP
var listPnPByUrl = context.Web.GetListByUrl("PnPByUrl");
Console.WriteLine(listPnPByUrl.Title);

// using PnP with expressions
var listPnPByTitle = context.Web.GetListByTitle("PnPByTitle", l => l.HasUniqueRoleAssignments);
Console.WriteLine(listPnPByTitle.Title);
Console.WriteLine(listPnPByTitle.HasUniqueRoleAssignments);

PnP 拡張メソッドの特徴

PnP 拡張メソッドの特徴として、内部的に Load & ExecuteQuery を実行しているため、ユーザー側のコードに Load & ExecuteQuery を書く必要がありません。
また、取得対象のオブジェクトが存在しない場合、拡張メソッドの戻り値として null を返します。
大量のオブジェクトを繰り返し処理する場合を除けば、PnP 拡張メソッドを積極的に使っても良いと思います。

CSOM や PnP の特徴(癖?)については後日まとめようと思います。

参照

SharePoint .NET Server、CSOM、JSOM、および REST API インデックス | Microsoft Docs

SharePoint のクライアント ライブラリ コードを使用して基本的な操作を完了する | Microsoft Docs

PowerShell 基本の気づき

コマンドレットのヘルプ表示

Get-Help (cmdlet)

docs.microsoft.com

コマンドレットのあいまい検索

Get-*User

docs.microsoft.com

変数一覧表示

Get-Variable

f:id:shibatea:20200101011656p:plain

docs.microsoft.com

Office 365 PowerShell

  • Azure AD v1 (MSOnline)
  • Azure AD v2 (Azure AD for Graph)
  • Azure AD v2 preview (Azure AD for Graph preview)

Azure AD v1 と Azure AD v2 (preview) は両方同時にインストールは可能
Azure AD v2 と Azure AD v2 preview はどちらか片方しかインストールできない

docs.microsoft.com