Sharepointのドキュメントライブラリ作業を自動化する【Powershell】

Sharepointのドキュメントライブラリを操作して、作業自動化をPowerhellで実現する方法の紹介です。

Sharepointのドキュメントライブラリを毎月手でチェックしていたので、これを自動実行するのが今回のお題です。まずはPowershellからSharepointにアクセスする方法から。

Sharepoint操作に必要な準備をする

Microsoftのサポートブログにほぼすべてが記載されていますので、こちらを御覧ください。

PowerShell で SharePoint CSOM を使用する際の Tips
かいつまんで言うと

  • クライアント サイド オブジェクト モデル(CSOM)を使うことでサイトコレクション配下のオブジェクトを操作できます。
  • .Net言語から操作できます。Powershellを使えばインストールも不要です。
    Windows操作の自動化もできます。
  • Sharepointバージョンに合わせたCSOMのライブラリをインストールする必要があります。

URLはすべてリンク先に手順含めて記載がありますのでそちらを参照してください。
入手できたら、アセンブリをLoadします。

それとアクセスしたいSharepointサイトのURLを準備します。
(サイトコレクションていう分かりにくい用語が出てきます。コレクションはMicrosoftがよく使う用語で、オブジェクトの集合体(配列)みたいな感じです。サイトコレクション=サイトオブジェクトの集合体くらいの意味。)

通常、認証が必要だと思うので認証情報を作ります。
認証情報はGet-Credentialコマンドレットを使って入力してもらうのがかんたんです。

上記の-Username,-Message引数は古いPowerShellだと使えないです。-Credential “ユーザネーム”オプションを使ってみてください。

ActiveDirectory認証してあるPCだったらそこから引っ張ることも可能です。

注)Sharepoint Onlineに対してDefaultNetworkCredentialsで認証が通るかは未検証です(^_^;)

PowerShellでは$env:USERDOMAINという環境変数にドメイン情報が格納されているので、これで認証済み端末かそうでないか判定できます。全体つなげると下記のようになります。

ここまでで、Powershellでアクセスする準備ができました。

Sharepoint操作の概念

まずはClientContextオブジェクトを用意します。Sharepointのサイトを開くブラウザをオブジェクト化(概念化)したものという理解でいいと思います。
ClientContextを作るには、サイトのURL(絶対パス)が必要です。

ClientContextは下記のAPIドキュメントを参照してください。。
SharePoint .NET API インデックス -Microsoft Doc

作成したContextに認証情報を付与します。

これでサイトコレクションにアクセスする準備ができました。でもこの$Conextオブジェクトにはまだ情報は入っていません。ブラウザにURLを入力し終わった程度の状態です。
$Context.Webプロパティを指定してロード→WebQuery(問い合わせ)を実行、でようやく読み込みが行われます。

試しに$objweb.Titleを入力すると、サイトのタイトルが表示されると思います。

データベースのSQL開発経験があればQuery準備→実行という順序を想像するとわかりやすいかもしれません。

ドキュメントライブラリの情報を取得する

ドキュメントライブラリの実体はリストです。Sharepointのリストをドキュメント格納に特化してカスタマイズしたのがドキュメントライブラリです。
ですので、操作としてはリストの操作とほぼ同じ書き方になります。
(Microsoftの技術ページはほぼリストの操作サンプルばっかり。困ったのでこの記事書いてます(^_^;)

情報を取得したり比較したりしようとするとCamlQueryという物を使います。

Collaborative Application Markup Language (CAML) スキーマ

つまりはXMLでQueryを書いていかないといけません。今回自分は、特定のフォルダにファイルが有るかどうかを見たいだけなのでファイルリストの一覧を取得してPowerShell側でチェックしたほうが楽そうです。

フォルダ内の一覧の取得

単にフォルダ指定したいだけなら、FolderServerRelativeUrlプロパティに指定すればできます。

DatesInUtc =$falseをつけないと、UTC(協定標準時)で時刻が返って来ます。

次にListオブジェクトを作ってやって、$Queryを指定して問い合わせ実行すればフォルダ内の一覧が返ってきます。

取得した一覧を操作する

取得したListItemsオブジェクトは連想配列でデータが格納されています。
一覧を表示させるだけなら下記のように書けばできます。(`tはタブ文字を表示させています)

ここの$item.idは更新や削除の際のキー項目になります。

ファイルをそのまま自動で操作する場合は、$TargetFileに格納して、下記のようにフルパスを設定します。

このフルパスをStart-Processで実行してやったり、Interopサービスを使ってやったりすればSharepointファイルの作業を自動化できます。

ドキュメントライブラリのアイテムの作成、更新、削除

作成・更新・削除もリストに対する操作と同じです。更新・削除の場合は上で書いたIDを指定して実行します。

下記はMicrosoftのC#サンプルですがここまで読んだ方なら理解できると思います。

リスト アイテムの作成、更新、削除

特定の文字から始まるファイル名を返す関数

特定の文字列から始まるファイル名を返す関数を作ってみました。Git-Hubに載せています。

おまけ

最初はUiPathとかRPAソフトで試していたんですが、Sharepointのオブジェクトを理解しないと作れないのでやめました。

Excelの操作もiteropサービスはたまにコケるのでClosedXMLとかExport-Excelとか使おうとしたんですが、URL形式での実行を許容しないのでやめました。ファイルのダウンロードして構わないのであれば、ダウンロード→実行の方が外部操作エラーが少ないと思います。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください