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

 SharePoint Online では、従来のワークフローに代わる新しいテクノロジとして、Microsoft Flow が利用できます。Microsoft Flow は、ノンコーディングで複雑なビジネス ロジックを実装することができます。仕事柄、SharePoint Online を毎日触るので、Flow でどんなできるのだろうかとを色々試しています。Flow + SharePoint に関する記事はまだまだ少ないので、色々残してみようと思います。

 
今回は、ドキュメント ライブラリへのファイル アップロードをトリガーに、自動的に採番するよう実装してみました。

採番のルールは、アップロード日時 (年 and 月) + アイテムの ID で生成するようにしています。


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