Office365 PowerAutomateを使ってExcel上の情報をファイルプロパティに同期

# 概要
Office365のPowerAutomate (以前はFlowという名前)を使ってSharePoint上のライブラリに格納されているファイルのプロパティを別途Excelで管理・同期するシステムの構築方法
![PowerAutomate.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608438/595a2dc2-ce88-0940-a184-1a32560032f8.jpeg)


##こんな方にオススメ
特にプログラム言語を知っているわけでは無いけど、毎回同じ動作を繰り返すのも面倒なのでどうにか自動化したい！という思いをお持ちの方にOfiice365のFlowはオススメです。
なぜなら後述の通りプログラム言語を一切書くことなくプログラムを組めてしまうからです!
(とはいえ、実際には少し複雑なことをやろうとすると若干プログラム言語的なものも出てきますが...)

### 背景
お恥ずかし話、弊社ではとある一連のPDFファイルを社内共有ドライブ上のフォルダに格納して、そのファイルがどういったものかを全く別のExcel上で管理するという非効率極まりない方法で20年近く運用していました。

そこでSharePointのライブラリの機能を使って、これまでExcelで管理してきた情報をプロパティとして各ファイルに付与させることでファイルのメンテ性と検索性の向上を図るという方法で改善を試みました。

しかしSharePoint上でファイルプロパティの編集をするのは非常に面倒なうえ、そもそもファイル数が優に2,000を超えていたので手入力で情報を付加させていくのは不可能、ということでExcelはファイル情報管理用として残しつつ、その情報をすべてファイルのプロパティとして同期するという方法で解決することにしました。

# 事前準備
####1. Excel内にテーブルを作成する
Flow上でExcelファイル内の情報を参照するためにはExcel内で"テーブル"を作成する必要があります。
複数の情報を一括で管理する、というようなファイルは大抵表形式になっていると思いますので、そのまま必要な情報が含まれる範囲をテーブル化します。

####2. ExcelをSharePoint上の任意のフォルダに格納する
これは後述するExcelファイルの変更をトリガーに自動でFlowを起動するために必要な措置なのですが、格納場所に関して一点注意があります。

それは**情報を付加させたいファイルとは別のライブラリに格納する**ということです。

なぜなら現状Flowではトリガーの対象となるのがフォルダ以上の階層のみで、ファイル単体の変更をトリガーにFlowを起動することができないからです。
もし情報管理用のExcelを情報が付加されるファイルと同じフォルダまたはライブラリに入れてしまうと、Excelの変更をトリガーにFlowを起動させると無限ループが生じることになります。
(実際にやったわけでは無いので定かでは無いですが...)

####3.ファイルを格納するライブラリに表示したい情報用の列を作成
ファイルのプロパティとして付加したい情報用の列をSharePointライブラリ上で設定しておく必要があります。
デフォルトで用意されている列が使えるならそれを使用しても大丈夫ですが、そうでない場合は新規で列を作成しましょう。

# Flowの作成
事前準備が完了したらFlowを作成していきますが、今回の目的は「Excel上の情報とファイルのプロパティを**"同期"**する」ことなので、以下の2つのFlowを作成していきます。

####1. フォルダに格納したファイルをトリガーにプロパティの同期をするFlow
####2. 情報管理用ファイルの変更をトリガーにプロパティの更新をするFlow


それではそれぞれ詳しく見ていきましょう。

##1. フォルダに格納したファイルをトリガーにプロパティの同期をするFlow
#####対象となるファイル
- これから格納するファイル

#####動作条件
- 情報管理用ファイルにこれから格納するファイルの情報が記入されている
- 格納するファイルのファイル名が情報管理用ファイル内のファイル名項目と**完全一致**している
(拡張子は含みません)

#####得られる結果
- 格納したファイルのみプロパティの同期が行われ、情報管理用ファイル内の情報がライブラリのプロパティ上に反映される

#####Flowの構造
![図面プロパティ更新[File name Key]_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608438/5eae9b5d-8c7f-7479-34b6-2fd6a8407956.png)

- TriggerとしてSharePointの「ファイルが作成または変更されたとき(プロパティのみ)」を使用
- 一つ目のActionにExcelの「行の取得」を使用、キー値として格納したファイル名を使用し取得する行を決定する
- 二つ目のActionにSharePointの「プロパティの更新」を使用、前アクションで取得した情報を各列にあてはめる

このFlowは単純に「Excel上のテーブルに記載されている情報をファイルプロパティに反映する」という最も基本的なものになります。
そのため次のFlowも基本的にはこのFlowと同じものが使用されていますが、トリガーとなる条件を変えることで**”同期”**するという状態を作り上げていくことになります。




##2. 情報管理用ファイルの変更をトリガーにプロパティの更新をするFlow
#####対象となるファイル
- 既にフォルダに存在するファイル
(対象とするファイル数と更新をかける順番は設定可能です)

#####動作条件
- 格納されているファイル名と情報管理用ファイル内のファイル名項目が**完全一致**している
(拡張子は含みません)

#####得られる結果
- 情報管理用ファイル内で変更した情報がフォルダのプロパティに反映される
(対象となるファイル全数の更新をかけます)

##### Flowの構造
![図面プロパティ更新[Excel Key]_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608438/c20028d9-8f9a-f5f4-48a4-ce6cfe124887.png)

- TriggerにSharePointの「ファイルが作成または変更されたとき」を使用
この機能を使用するために情報管理用ファイルはファイルを保存するライブラリ・フォルダとは別の場所に保存します
- 一つ目のActionにSharePointの「ファイルの取得(プロパティのみ)」を使用しファイルが保存してあるフォルダからファイルのプロパティを取得

この「ファイルの取得(プロパティのみ)」で詳細設定を行わない場合、FlowはIDが古い(ファイル格納が古い)順に100項目までしか作動しないようデフォルトで設定されています。

そのためファイル数が100を超えるような場合は詳細設定を行う必要があります。

ちなみに画像の例ではプロパティを取得する対象ファイル範囲の限定に2段階踏んでいます。

まず「フィルタークエリ」に`OData__x4f5c__x6210__x8005_ ne null`と設定。
これは"\_x4f5c_\_x6210_\_x8005_"(ファイル格納ライブラリの作成者という列のシステム上の名前)列の内容がnullではないものというフィルターで、必須入力項目に設定している"作成者"が記入されていないファイルを除外しています。

2つめは「並べ替え順」に`ID desc`、「上から順に取得」を`200`と設定し、これによりIDが大きいほうから順に200番目までのファイルプロパティを取得するようにしています。

以降のFlowの構造は一つ目のFlowと同様で、Excelのテーブルから必要な情報を取得してプロパティに反映するという流れになります。
(Apply to eachは「ファイルの取得(プロパティのみ)」で複数項目のプロパティを取得するため自動で適用されます)



#####SharePointライブラリの列名について
ちなみにSharePointライブラリの列名の確認方法ですが、ライブラリ設定内の各列の編集ページURLの`Field=`以降の部分が列名になります。


# 終わりに
私は上記２つのFlowに加えてさらに「必須記入列がnullのものだけ」を対象にしたFlowを作成してExcelファイル内の情報を格納したファイルに自動で同期させるという状態を作り上げています。

私の置かれている状況ではファイル数が多いので、できるだけステータスの異なるファイルは別々のFlowで管理したかったために全部で3つのFlowを利用しています。

しかしそうでないならば2つのFlowだけで常にExcelファイル内の情報を各ファイルに反映させることができます。


Flowを使えばプログラム言語を使わずとも簡易的なシステムを組むことができますが、一つのFlowにつきトリガーは一つしか使えないためあまり複雑なことはできません。

複雑なことをFlowで行おうとするならば今回のように複数のFlowを併用して対応していく必要がありそうです。