PnP PowerShell で Sharepoint を操作しよう: (3) 簡単なリストを作ろう

皆様こんにちは。

3回目は、簡単にSharePoint のリストを作るところをお見せしたいとおもいます。

サイトもPnP で作れるのですが、ここはわたしは手作業で行いました。
リストを作成するには、[New-PnPList](https://docs.microsoft.com/ja-jp/powershell/module/sharepoint-pnp/new-pnplist?view=sharepoint-ps) コマンドを使います。
ポイントは、リスト名をいきなり日本語で作成せず、コマンドで触りやすいように英字の名前を先に与え、表示名として日本語名を後から与えるところです。
英字の名前は -url で与えて、日本語の表示名は -title で与えます。

```
new-pnplist -title "日本語名" -url "Alphabet" -Template genericList
```

手作業でリストを作る際も、作成時には英字で作成してそれから日本語にリネームすることで、urlに現れる内部名を英字にすることができます。

-Tenplate でリストの種別を選びます。SharePointで「リスト」を選ぶのに相当するのは"genericList" です。ほかにDocumentLibrary、Contacts、Events、 Tasks なども定義されています。みんなリストの一種なのですね。


サイトのリファレンスではわかりにくいのですが、-Template で使える名前は [ListTemplateType](https://docs.microsoft.com/en-us/previous-versions/office/sharepoint-server/ee541191(v=office.15)) に一覧があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368667/485e3c2a-23ef-e89a-3ad7-bcb31f5621be.png)

さあ、日本語の名前でリストが作られました。
URLのほうは"Alphabet" となっています。

初期状態では、「名前」(Title) だけが存在します。
ここでは、わたしの実例に基づいて、”商品コードマスタ"(ProductCode)というリストを作成します。

フィールドは
Title: "名前"-> "商品名"に変更、インデックスあり
code: "商品コード"、インデックスあり
Modified (更新日時)：インデックスあり
としてみます。

使う命令は 
[Add-PnpField](https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/add-pnpfield?view=sharepoint-ps)
[Set-PnpField] (https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/set-pnpfield?view=sharepoint-ps) 
[Set-PnpList] (https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/set-pnplist?view=sharepoint-ps) 
[Add-PnpView](https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/add-pnpView?view=sharepoint-ps), 
です。

```
    #リスト作成
    $Title = "商品コードマスタ"
    $Url="ProductCode"
    New-PnPList  -url  $Url -Title $Title -Template GenericList
    #フィールド追加
    Add-PnPField -List $Url -DisplayName "商品コード" -InternalName "code" -Type Text  -AddToDefaultView

    #Title 列の標準名は「名前」なので、「商品名」に変更する。またindex を有効にする
    Set-PnPField -List $Url -Identity "Title" -Values @{"Title"="商品名"; "Indexed"=$true} 
    #既存列の属性を変える。名前を指定するときは、InternalName で指定した"code"のほうを使う
    Set-PnPField -List $Url -Identity "code" -Values @{"Indexed"=$true} 
    Set-PnPField -List $Url -Identity "Modified" -Values @{ "Indexed"=$true} 

    Set-PnPList -Identity $Url -EnableAttachments $false
```
ここまでは難易度は低めでしょうか。

ここで、一つ目のハードルです。
[Add-PnpView](https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/add-pnpView?view=sharepoint-ps) で、ビューを一つ作ります。作るだけならリファレンス通りに

```
Add-PnPView -List "Demo List" -Title "Demo View" -Fields "Title","Address"
```
でいいのですが、それ以上のことをしようとすると、-Query を指定する必要があります。
。

-Query については、
>-Query
> valid CAML Query.
> Type:	String

という説明しかありません！
[CAML (コラボレーションアプリケーションマークアップ言語](https://docs.microsoft.com/ja-jp/sharepoint/dev/schema/introduction-to-collaborative-application-markup-language-caml) の解説をみても、範囲が広すぎます。
SharepointのList の[Query 要素 (リスト)](https://docs.microsoft.com/ja-jp/sharepoint/dev/schema/query-element-list) の解説のほうが今回の目的にあっています。。

わたしがここでやりたいのは、ソート順の定義です。CAMLなんて知らないよーと困りましたが、見よう見まねでこんなクエリーを書いたら動きました。

```
    #ビューの追加 フィールドおよびクエリ内での参照先は英語のInternalName のほうを使う
    Add-PnPView -List $Url -Title "コード昇順" -Fields "code","Title" -SetAsDefault -Query "<OrderBy><FieldRef Name='code' Ascending='true'/></OrderBy>" -Paged
```
最後は、SharePoint の左欄のナビゲーションリンクにこのリストを追加します。

```
    #左のナビゲーション(クイックランチ)に登録
    Add-PnPNavigationNode -Title $Title -Url $Url -Location QuickLaunch 
```
今回はここまでにします。

CAML は結構何度も出てくることになります。

[Building CAML for querying List in SharePoint](https://www.codeproject.com/Articles/993035/Building-CAML-for-querying-List-in-SharePoint)
Atish Dipongkor, 19 Oct 2016 
という記事が、PnP PowerShell 用ではないですが、ListとCAMLの対応関係を説明していてわかりやすいと思います。
この記事には、REST APIでリストの情報を取得して、CAML部分を抽出するテクニックが出てきます。あとから知って、これ使えたら楽できたのに！と泣きました。