リストフォームに採番機能を実装する(PowerApps編)

前回に引き続きPowerAppsネタです。

このたびもSharePointあるある要望、カスタムのIDをアイテムに振りたい!というので採番機能を実装してみます。
採番のやり方はいろいろあると思いますが、今回は最後に登録されたアイテムのIDをインクリメントする方法をとりました。

あらかじめ、SharePointリストにはcustomIDという1行テキスト列を作成しておきます。
PowerAppsでフォームを開き、customIDのデータカードで、詳細設定のロックを解除します。
ユーザーが任意の値を入れられないよう、DisplayModeプロパティをDisplayMode.Viewに設定します。

次に、Defaultと、フォームの編集中にほかのユーザーが新しくアイテムを作ったケースに備え、Updateにもに以下の式を設定します。

If(SharePointForm1.Mode=New, 
Concatenate("Custom-",Text(First(SortByColumns(customList, "ID", Descending)).ID + 1, "000")),
ThisItem.customID)

これで、新規フォームを開くとcustomIDに以下のように最後のIDをインクリメントした値が表示されます。

※Text関数で、3桁になるよう0埋め表示にしています。

なお、最後に登録されたアイテムのIDの取り方ですが、First関数でなくLast関数やMax関数、あるいはIDを使わずCountRows関数などでもいいんではないか、という意見があると思います。
しかし、PowerAppsには委任問題というものがありまして・・・
かいつまんでいうと、委任とは関数による計算を直接データソース側でできるということと解釈してます。
では、委任されていない関数を使った場合どうなるかというと、最初の500件のデータだけローカルにダウンロードして、計算対象とするということのようです。
SharePointをデータソースとする場合、委任できる関数はSort、Filter、Search関連の関数だけなので、LastやMaxを使うと最初の500件しか使われないので正しくIDが取れないのですね。
そのため、IDの降順でソートして、最初にきたアイテムのIDを参照するようにしています。
委任については、以下Microsoftのドキュメントも参考にしてください。(何をいってるかよくわからん部分もありますが)
委任について

まあ、PowerAppsの機能は日々進化しているようなので、何か月かしたら委任できる関数も増えているかもしれないですけどね。
ともあれ、通常のSharePointリストフォームだと、最後に登録されたアイテムのIDを参照するのは骨が折れますが、PowerAppsだと関数一発でとれるのでちょっと感動しました!

広告

新規フォームにログインユーザー名を表示(PowerApps編)

さて、SharePoint OnlineではPowerAppsを利用してフォームのカスタマイズができるようになりましたね。
PowerApps を使用した SharePointリストフォームのカスタマイズ
こうなるとInfoPathは完全に過去の遺物ですね・・・

というので、さっそくSharePointあるある要望、新規フォームのPeople Pickerにログインユーザーをデフォルト表示をPowerAppsで実装してみました。

まずはMicrosoft公式の以下の情報を元に試しました。
PowerAppsユーザーに関する情報を表示する
でも、User()関数をそのままPeople Pickerのデフォルト値に設定してみてもうまくいきません。
たぶん、データ型がテキストでないとだめなんでしょうね・・・

で、調べた結果下記スレッドを発見。
https://powerusers.microsoft.com/t5/General-Discussion/Set-current-user-as-default-value-of-Person-or-Group-field/td-p/78744
しかし、ここに書いてあるようにドロップダウンのデフォルト値やDataCardのUpdateに設定したりしてみたもののやはりうまくいかず・・・

いろいろ試した結果、DataCardのデフォルト値に以下の式を書いたところうまくいきました!

If(SharePointForm1.Mode = New,
{'@odata.type':"#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
Claims:Concatenate("i:0#.f|membership|",User().Email),DisplayName:User().FullName,
Email:User().Email},
ThisItem.Requestor)

ついでに、上のサンプルではDataCardの中にLabelを2つ設置し、People Pickerで選択したユーザのメールアドレスと部署を表示するようにしています。
設定方法ですが、事前にOffice365 Userへのデータ接続を追加しておき、LabelのTextに以下のような式を書くだけです。

Concatenate(
"Mail: ",
Office365ユーザー.UserProfile(DataCardValue11.Selected.Email).Mail
)

※DataCardValueのところは、お使いの環境に合わせて変更してください。
なお、Office365 Userに接続してユーザーのプロファイル情報をもってくるやり方は、以下Microsoftのドキュメントを参考にしました。
PowerApps から Office 365 ユーザーの接続に接続する

PowerAppsについてはまだまだ情報も少なく全貌をつかめてませんが、なんかいろいろできそうな予感がしてます。
また新たな発見があれば、記事にしたいと思います!

列の書式設定を試してたらIE11のバグに遭遇した話

こんにちは。
めずらしくSharePoint Onlineの話題でも。
モダンUIの案件管理リストで、ステータス列に赤青黄色の信号機を表示しようと列の書式設定をいろいろ試していたときのお話です。

手始めにMicrosoftの公式ドキュメントを見ていたら、
列の書式設定で SharePoint をカスタマイズする
以下git-hubレポジトリにほぼそのものなサンプルがあったので、さっそく拝借します。
Traffic Light (Red-Yellow-Green) Status Indicator
できたできた、と喜んでいたところ、IE11でみたときだけ上下センタリングが効かず上に張り付いちゃってます。

なんでだ・・・と頭を悩ましつつ、CSSを調べてみたところ、列の書式設定をすると自動的に「.sp-field-customFormatter」というクラスが当たるみたいなんですが、ここのalign-items: centerが効いていないようです。

さらに調べると、これIE11のバグの模様。
https://github.com/philipwalton/flexbugs/issues/231
display:flexの要素で、min-heightを指定するとalign-items: centerが効かなくなるみたいです・・・
Microsoftぅー!!!という感じですが、気を取り直して上記スレッドのworkaroundを試してみました。
min-heightより小さい値、ということでheightに10pxほど指定してみます。
おおー、うまくいきました!

以下、サンプルコードです。

事情を知らない人からみたら意味不明のスタイル指定ですが、指摘されたらIE11で中央揃えにするオマジナイだと言ってあげてください。
(てゆーかIE11のバグを直してほしいですけどね!)

集計値のHTMLをJSリンクで修正する

ひさびさの投稿になっちゃいましたが生きてます。

昨年より以下のようにいろいろと話題になっておりますが、集計値列でHTMLを出力しビューの見栄えを整えるワザが使えなくなってしまいましたよね。

June 13th 2017 Microsoft blocked handling HTML markup in SharePoint calculated fields – how to get the same functionality back – SharePoint Stack Exchange

で、ついにこの波が我が職場にもやってまいりまして大騒ぎになっておりましたが、クライアントサイドでクイックに対応したいということでJSリンクを使って修正することにしました。
以下、サンプルコードです。
※ビュー上に複数の集計値列でHTMLを出力しているパターンとなります。

こんないい加減なコードでいいのか・・・と思いますが、ちゃんと動くのですよ、これが。
これを、集計値列を表示しているビューにJSリンクとして設定してください。
JSリンクの設定方法は、以下にあります。
JSリンクを使ってビューにニコちゃんマークを表示してみた

ビューがいっぱいあると大変ですが、今すぐ!直さなければ!というときのご参考にしてください。

SharePointの入力フォームで列名の下にDescriptionをもってくる

半年ぶりの更新です(ひゃーーー)。
てゆーか最近SharePoint2007に携わっているので、ネタないんです・・・
はやく2016さわりたい~!!!

というわけで小ネタをちょっとだけ。

SharePointの列にはDescriptionを設定できます。入力例や注意事項を記載したいときに便利です。
pic20160927-1

でも、デフォルトのDescriptionの場合、入力欄の下に配置されるので見落とされがちなんですよね。
また、URLも貼れたりしますが、表示文言を自由に設定してハイパーリンク化はできません。

そこで、JavaScriptでDescriptionに書きたい内容を列名の下に持ってきてみました。
pic20160927-2

ソースコードです。
こちらをコンテンツエディタwebパーツでNewForm.aspxとEditForm.aspxに埋め込んでください。

コード内の”Body”のところはDescriptionを置きたい列名に適宜変更してくださいね。
ちょっとしたことですが、ユーザビリティーの向上につながる・・・かも?

SharePointファーム全体でADのセキュリティグループに割り当てられているアクセス権を洗い出すPowerShellスクリプト

題名、長かったですね。

SharePointファーム全体でADのセキュリティグループで付与されている権限の一覧を取りたい!取らねばならぬ!しかもアイテム単位まで!となったことがありまして、PowerShellなんかほとんどいじくったことなかったけどエイヤーと書いてみました。
ちなみに、これ動かした環境はMOSS2007 なので、2010、2013だと書き方のお作法が違うと思います。

PowerShell初心者ゆえコードきたなくて済みません。
もっと簡単に書けるよ、というアドバイスがありましたら、ぜひコメントくださいませ。

ともあれPowerShellのパワーを思い知りました(シャレではない)。使いこなせればいろいろできそう。
2013バージョンなどもそのうち機会がありましたら書くかも、書きたいな。

SharePointのリストフォームに採番機能をJavaScriptで実装する

この世にはようかんぱんなるものがあることを知り気になって仕方ないのですが、そんなことはどうでもいいですね。

さて、だいぶ間が空いてしまいましたが久々の更新です!
いぜん、ページにビューカウンタをつける方法をポストしましたが、意外とよく読まれているようなので、気を良くして応用編(?)です。

SharePointのリストアイテムに、システム的に振られるIDではなく、独自ルールで採番したカスタムIDを振りたい!という要望はよくありますよね。
そこで、ページビューカウンタと同じやり方で、採番機能を実現してみました。
新規フォームで見るとこんな感じ。
20151217

実装方法です。
事前に「counter」という名前の採番用カスタムリストを同じサイト内に作成しておきます。
採番用カウンタは、Titleフィールドをそのまま使います。
新規フォーム作成時に、採番用リストから番号を取得し採番フィールドに表示、保存時のアクションでインクリメントした番号を採番用リストに返す仕組みです。
なので、新規フォームをキャンセルした場合は、インクリメントされません。

以下、ソースコードです。
こちらをNewForm.aspxにコンテンツエディタwebパーツで埋め込んでください。

SPServicesjQuery使ってます。

さらにちょっとした小技として、

21行目:カスタムIDの数値部分を桁固定0埋めで表示
23行目:採番フィールドを読み取り専用にする
24行目:採番フィールドがフォームの最初のフィールドでもフォーカスを当てない

などを盛り込んでおります。

なお、EditForm.aspxには以下を埋め込んでおきます。

検証環境は2010ですが、2007、2013でも動くと思います。
参考にしていただけるとうれしいです!