none
PowerShellで、Office365のリストにアイテムを作成したい。 RRS feed

  • 質問

  • PowerShellを使い、Office365(SharePoint Online)上のリストに、アイテムを作成したいと考えております。

    しかし、Office365へのログインまでのコードは書けましたが、作成処理する所が分からず、つまずいております。

    【途中までのコード:ログインまで】

    #############################################
    # .NET CSOM モジュールの読み込み
    #############################################
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")         | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
    
    #############################################
    # 変数宣言			-- 対象URL --
    #############################################
    $siteUrl         = "サイトのURL"
    $accountName     = "アカウント"						# アカウント名
    $passWord        = ConvertTo-SecureString -AsPlainText -Force "パスワード"			# パスワード( $ が使用されている場合は、`$ にする)
    $listName        = "リスト名"													# 対象リスト名
    
    #############################################
    # ログイン情報取得
    #############################################
    $ctx             = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)								# オブジェクト作成:ClientContext
    $credentials     = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($accountName, $passWord)	# SharePoint Online 認証情報
    $ctx.Credentials = $credentials																					# ログイン
    
    #############################################
    # リストを取得
    #############################################
    $list            = $ctx.Web.Lists.GetByTitle($listName)		# リスト情報取得
    $listInfo        = $list.Fields								# リスト内テーブル(列)取得
    $ctx.Load($listInfo)										# 読込
    $ctx.ExecuteQuery()											# 実行

    【恐らく、この後に続くであろうコード】

    $items = $listInfo.Items
    $item = $items.Add()
    $item["Title"] = "テストアイテム作成"
    $item.Update()

    と考えているのですが、

    【エラーメッセージ】

    You cannot call a method on a null-valued expression.

    とエラーメッセージが出てしまい、解決方法が分かりません。

    アイテムを作成する為の、メソッドを定義しろって事でしょうか?

    分かる方いれば、教えて下さい。

    よろしくお願い致します。


    • 編集済み mie.8 2017年10月31日 4:42 変更
    2017年10月31日 4:41

回答

  • とりあえず、提示いただいたコードをもとに、動くコードを載せておきます。

    #############################################
    # .NET CSOM モジュールの読み込み
    #############################################
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")         | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
    
    #############################################
    # 変数宣言			-- 対象URL --
    #############################################
    $siteUrl         = "サイトのURL"
    $accountName     = "アカウント"						# アカウント名
    $passWord        = ConvertTo-SecureString -AsPlainText -Force "パスワード"			# パスワード( $ が使用されている場合は、`$ にする)
    $listName        = "リスト名"													# 対象リスト名
    
    #############################################
    # ログイン情報取得
    #############################################
    $ctx             = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)								# オブジェクト作成:ClientContext
    $credentials     = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($accountName, $passWord)	# SharePoint Online 認証情報
    $ctx.Credentials = $credentials																					# ログイン
    
    #############################################
    # リストを取得
    #############################################
    $list            = $ctx.Web.Lists.GetByTitle($listName)		# リスト情報取得
    $listInfo        = $list.Fields								# リスト内テーブル(列)取得
    $ctx.Load($listInfo)										# 読込
    $ctx.ExecuteQuery()											# 実行
    
    
    #############################################
    # アイテムを作成
    #############################################
    $creation = New-Object Microsoft.SharePoint.Client.ListItemCreationInformation
    $item = $list.AddItem($creation)
    $item["Title"] = "テストアイテム作成"
    $item.Update()
    $ctx.Load($item)
    $ctx.ExecuteQuery()
    

    (AddItemにはCreationInformation渡さないといけないですね…スミマセン…)

    • 回答としてマーク mie.8 2017年11月1日 6:41
    2017年11月1日 1:03

すべての返信

  • こんにちは。

    パッと見では使っているメソッドが違う気がします。

    $item = $list.AddItem()
    $item["Title"] = "テストアイテム作成"
    $item.Update()
    $ctx.Load($item)
    $ctx.ExecuteQuery()

    List.AddItem method

    2017年10月31日 5:15
  • ご回答ありがとうございます。

    上記、ソースを参考に何度か動かしてみたのですが、アイテム作成が出来ませんでした。

    $item = $list.AddItem()

    の時点で、Method invocation failed because [Microsoft.SharePoint.Client.FieldText] does not contain a method named 'AddItem'.

    とエラーが出てしまいます。

    $item = New-Object Microsoft.SharePoint.Client($listInfo)

    の様に、オブジェクトを宣言してもダメでした。

    PowerShell自体の知識が、まだまだ不足しているため

    ①宣言の仕方が悪いのか?(書き方が違う? 宣言するメソッドが違う? かが、分かりません。)

    ②アイテムを作成するのに、「AddItem()」以外の関数を使用すれば出来るのか?

    が分かっておりません。

    お伺いばかりで、申し訳ございません。

    • 編集済み mie.8 2017年10月31日 6:52 変更
    2017年10月31日 6:48
  • $list = $ctx.Web.Lists.GetByTitle($listName) # リスト情報取得
    

    前回のコードでは上記のようになっているので、$listにはMicrosoft.SharePoint.Client.Listが入っているはずです。
    Microsoft.SharePoint.Client.FieldTextということは、

    $item = $items.AddItem()
    

    のようにしていないでしょうか?
    GetType()メソッドを呼び出せばその変数が何の型か取り出せますので、確認してみてください。

    2017年10月31日 6:54
  • 度々、ご回答ありがとうございます。

    GetType()メソッドを使用した所、

    IsPublic IsSerial Name

    -------- -------- ----

    True     False    FieldCollection

    BaseType
    --------
    Microsoft.SharePoint.Client.ClientObjectCollection`1[Microsoft.SharePoint.Client.Field]

    が、取得出来ました。

    取得した型は、「コレクション型」ですか?

    • 編集済み mie.8 2017年10月31日 7:10 .
    2017年10月31日 7:09
  • とりあえず、提示いただいたコードをもとに、動くコードを載せておきます。

    #############################################
    # .NET CSOM モジュールの読み込み
    #############################################
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")         | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
    
    #############################################
    # 変数宣言			-- 対象URL --
    #############################################
    $siteUrl         = "サイトのURL"
    $accountName     = "アカウント"						# アカウント名
    $passWord        = ConvertTo-SecureString -AsPlainText -Force "パスワード"			# パスワード( $ が使用されている場合は、`$ にする)
    $listName        = "リスト名"													# 対象リスト名
    
    #############################################
    # ログイン情報取得
    #############################################
    $ctx             = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)								# オブジェクト作成:ClientContext
    $credentials     = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($accountName, $passWord)	# SharePoint Online 認証情報
    $ctx.Credentials = $credentials																					# ログイン
    
    #############################################
    # リストを取得
    #############################################
    $list            = $ctx.Web.Lists.GetByTitle($listName)		# リスト情報取得
    $listInfo        = $list.Fields								# リスト内テーブル(列)取得
    $ctx.Load($listInfo)										# 読込
    $ctx.ExecuteQuery()											# 実行
    
    
    #############################################
    # アイテムを作成
    #############################################
    $creation = New-Object Microsoft.SharePoint.Client.ListItemCreationInformation
    $item = $list.AddItem($creation)
    $item["Title"] = "テストアイテム作成"
    $item.Update()
    $ctx.Load($item)
    $ctx.ExecuteQuery()
    

    (AddItemにはCreationInformation渡さないといけないですね…スミマセン…)

    • 回答としてマーク mie.8 2017年11月1日 6:41
    2017年11月1日 1:03
  • 返信遅れまして、申し訳ございません。

    ソースコード、ありがとうございます。

    無事動きました。

    これを元に、任意の数分アイテムを自動作成出来るようにする等、改良を加えて行きたいと思います。

    ありがとうございました。

    2017年11月1日 6:42