none
一度入力したイベントを編集し別IDで保存 RRS feed

  • 質問

  • 予定表をカスタマイズ(行を追加)してリストを作成しています。

    一度作成したイベントの一部を編集し別IDとして保存する方法はありますか?

    要は、ひとつのイベントを1つのファイルと見立てた場合、

    ファイルを開いて記入済みの内容を編集して、別名で保存する様なイメージと同様です。

    調べた限りではできないとは思うのですが、、もし何か良い方法があれば。

    趣旨としては入力がパターン化されているので、あるパターンによっては決まった内容を自動で入れたり、

    というようなことができればベストです。

    ※追記

    なお、データシートビューで開いてコピー&ペーストする方法もやってみましたが、

    なぜかスペースが入っていて隣が空白だとずれてしまうようで、使用できませんでした。

    添付の図のようなイメージです。これくらい入力する列が少ないと本当はずれませんが、

    入力列が非常に多く、情報が多いとずれてしまうようです。(原因は特定できていません)

    • 編集済み QlsIm 2017年6月1日 9:19
    2017年6月1日 7:52

回答

  • みなさま ありがとうございます!

    「ri0123さん」の回答を参考にさせていただきましたが、それでもコピーができず、

    結局社内のJava Scriptがわかりそうな方に相談しまして、下記の通り対応しましたらできました。

    今後、私のようにJava Scriptがわからない方、初心者でも対応できるように注意点を記録として残しておきます。

    みなさま、いろいろとご協力いただき本当にありがとうございました!

    ★リストに保存済みの内容を編集して別IDで保存する方法(SharePoint Online利用の場合)

    Sharepoint アイテムのコピー」をネット検索しますと、

    一般の(とある企業の)サイト(blog)にやり方が書いてあるので、手順はそちらを参照ください。

    Java Scriptは下記の注意点を参考にされるとよいと思います。

    (JavaScriptご存知の方には初歩かもしれませんが、わからない方のために・・・)

    ★下記のコードを記載する際の書き換え箇所とポイント

    ・「単一データを選択してコピー」:コピー用のボタンができますので、そのボタンに表示させたい内容に書き換え。

    ・「リスト名」:リストの名称を日本語で名前をつけているのであれば、そのまま日本語で書き換え。

    ・「Title」~「Line3」:列の名称を入力するのですが、日本語で列名を設定している場合そのまま入力ではなく内部列名にします。
    ※内部列名の確認方法:実際に入力した内容を開き右クリックで「ソースの表示」
    列の名称をCtrl+Fで検索すると、「"SPBookmark_○○"」と表示されますので、○○の箇所をピックアップ
    ※要注意:「"SPBookmark__○○"」と○○の先頭にもアンダーバーがあることがあるので、コピーし忘れに注意。
    このアンダーバー有無がコピー可否に左右されますので十分注意してください。

    ・列を追加していて10行作成されている場合は、「oListItem.set_item('xxx', currentItem.get_item('xxx'));」が10個ある状態になります。

    ・「コピーしました!」:選択したIDをコピーされると表示されるポップアップメッセージ内の文章なので、適宜変更

    ・「リストのURL」:リストのトップページのURLをここにコピー


    <input type="button" onclick="CopyItem()" value='単一データを選択してコピー'/>
    <script type="text/javascript">
    	var context;
    	var currentItem;
    	var sourceList;
    
    	function CopyItem(){
    		context = SP.ClientContext.get_current();
    		var selectedItemIds = SP.ListOperation.Selection.getSelectedItems(context);
    		var web = context.get_web();
    		sourceList = web.get_lists().getByTitle('リスト名');
    		currentItem = sourceList.getItemById(parseInt(selectedItemIds[0].id));
    		context.load(currentItem);
    		context.executeQueryAsync(Function.createDelegate(this,Endload),
    			Function.createDelegate(this,error));
    	}
    	function Endload(sender, args){
    		var itemCreateInfo = new SP.ListItemCreationInformation();
    		this.oListItem = sourceList.addItem(itemCreateInfo);
    		oListItem.set_item('Title', currentItem.get_item('Title')+'_コピー');
    		oListItem.set_item('Line2', currentItem.get_item('Line2'));
    		oListItem.set_item('Line3', currentItem.get_item('Line3'));
    		oListItem.update();
    		context.executeQueryAsync(Function.createDelegate(this,endCopy),
    		Function.createDelegate(this, error));
    
    	}
    	function endCopy(){
    		alert('コピーしました!\nTitle:' + currentItem.get_item('Title') + '\nID: '+ oListItem.get_id());
    		var url = 'リストのURL?ID=' + oListItem.get_id();
    		location.href = url;
    	}
    	function error(sender, args){
    		alert(args.get_message());
    	}
    </script>
    


    • 回答としてマーク QlsIm 2017年6月19日 5:49
    2017年6月19日 5:45

すべての返信

  • >>一度作成したイベントの一部を編集し別IDとして保存する方法はありますか?

    アイテムのコピーを作成した上で、編集する方法ではいかがでしょうか。
    アイテムのコピーであれば、ワークフローでも可能ですし、
    JavaScriptで簡易的に実現できる技術的な情報もweb上に多く存在します。

    「Sharepoint アイテムのコピー」等で検索することをお勧め致します。

    ----------------------------------------------------------------------------------
    特定個人様サイトへのリンクをコピーの方法として返信することが憚られるため
    情報提供のみになりますがご理解下さい

    2017年6月2日 9:43
  • ありがとうございます。早速、検索してみました。

    SharePoint自体の機能としては無く、なんらかの開発が必要になるということですね。。

    JavaScriptがまったくわからないので、内容を見てもできる自身が正直ありません…。


    ちなみに、検索したとある個人サイトで列の名前は半角で、

    と記載がありましたが、全角で日本語(ダブルバイト)ですと、

    バグで使えないでしょうか?

    既にカスタマイズして作成した大量の列が存在しており、

    すべて日本語で半角の英語の列名にすることは運用上もなかなか難しいのです…。



    2017年6月5日 1:21
  • PowerShellを利用するのが楽だと思いますので、サンプルコードを作成してみました。

    実行する端末には、以下をインストールしておいてください。

    SharePoint Server 2013 Client Components SDK

    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") > $null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") > $null
    
    $context = New-Object Microsoft.SharePoint.Client.ClientContext("http://hostname/sites/site/")
    $context.Credentials=New-Object System.Net.NetworkCredential("username", "password", "domain")
    
    $web = $context.Web
    $context.Load($web)
    $context.ExecuteQuery()
    
    # コピー元イベントの取得
    $list = $web.Lists.GetByTitle("予定表")
    $listitem = $list.GetItemById("1")
    $context.Load($listitem)
    $context.ExecuteQuery()
    
    # フィールド名と値の表示(コピーには不要)
    $listitem.FieldValues
    
    # コピー先イベントの作成
    $newEventCreateInfo = New-Object Microsoft.SharePoint.Client.ListItemCreationInformation
    $newItem = $list.AddItem($newEventCreateInfo)
    
    # コピー先イベントにフィールド値をコピー
    $newItem["Title"] = $listItem["Title"]
    $newItem["EventDate"] = $listItem["EventDate"]
    $newItem["EndDate"] = $listItem["EndDate"]
    $newItem.Update()
    $context.ExecuteQuery()

    適宜、パラメータ等の変更をお願いいたします。(環境が書かれていなかったので、オンプレのSharePointへの接続で記述してあります)

    また、フィールド値のコピーは、他にコピーが必要なフィールドもあると思いますので、適宜追加してみてください。


    2017年6月5日 4:19
  • 画面上から操作して追加できる機能としては無く、開発が必要になるとは思います。
    「SharePoint Designer」を使用すれば、アイテムのコピーを機能(ワークフロー)として追加できなくもないですが
    こちらも使い方から習得する必要があります。

    >>全角で日本語(ダブルバイト)ですと、
    >>バグで使えないでしょうか?
    通常利用する際には全く問題ないと思います。

    ご覧になったサイトの管理者様は恐らく「内部列名」のことを紹介しているのだと思います。
    ここで「内部列名」について語りだすと長くなってしまいますので申し訳ございません・・・検索をお願いします。

    因みにカスタマイズなどを行う際には、内部列名をダブルバイトで作成したものも利用できますが、
    少々コードが書きづらい点はあるかもしれません。
    また、リスト・ライブラリなどの作成時も内部名+URLとしても利用することになりますので
    今後カスタマイズを想定するのであれば、既存のものは仕方ないとして
    以降リストや列を作成する場合は考慮することをオススメします。

    2017年6月5日 4:36
  • ありがとうございます!

    しかし、残念ながらオンプレではなくOffice365のSharePointを使っております…。

    環境を記載しておらず、大変申し訳ございません!

    こちらそのままは適応できないですよね?

    ちなみに、「Sharepoint アイテムのコピー」でGoogle検索した際にトップででてくる、

    とある企業のブログにあるコードを使って、内部列についてもソースで確認してやってみましたが、

    「単一データを選択してコピー」だけが枠で囲まれ、

    それ以外はそのままコードがテキストで表示されるだけで、ダメでした。。。


    • 編集済み QlsIm 2017年6月8日 8:06
    2017年6月8日 8:05
  • ありがとうございます。

    「SharePoint Designer」を使用すれば、アイテムのコピーを機能(ワークフロー)として追加

    SharePoint Designerを使ったワークフローは一度設定したことはありますが、

    今回は特定条件に該当したものをコピーする、ということではなく、

    自分で選択してコピーするかたちになるため、なかなかワークフローでは難しいかもしれません。

    >ご覧になったサイトの管理者様は恐らく「内部列名」のことを紹介しているのだと思います。

    こちらについては、知っていそうな方へ確認し、ソースコードで内部列を確認できたので、

    「Sharepoint アイテムのコピー」でGoogle検索した際にトップででてくる、

    とある企業のブログにあるコードを使って、やってみましたがダメでした…。


    2017年6月8日 8:11
  • >しかし、残念ながらオンプレではなくOffice365のSharePointを使っております…。

    承知しました。前回のコードの認証部分を以下の通り変えて試していただければと思います。

    ・オンプレSharePoint

    $context = New-Object Microsoft.SharePoint.Client.ClientContext("http://hostname/sites/site/")
    $context.Credentials=New-Object System.Net.NetworkCredential("username", "password", "domain")

    ・SharePoint Online

    $pwd = convertto-securestring "password" -AsPlainText -Force
    $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials("username", $pwd)
    $context = New-Object Microsoft.SharePoint.Client.ClientContext("https://xxxxxxx.sharepoint.com/sites/site/")
    $context.Credentials = $credentials



    2017年6月8日 8:36
  • >>とある企業のブログにあるコードを使って、内部列についてもソースで確認してやってみましたが、
    >>「単一データを選択してコピー」だけが枠で囲まれ、
    >>それ以外はそのままコードがテキストで表示されるだけで、ダメでした。。。

    (1)コードに以下を追加(上記の問題解決)
     2行目に以下を挿入
     <script type="text/javascript">
     最終行に以下を追加
     </script>

     …inputタグ以外をscriptタグで囲う

    (2)記号を半角に置換
     ソースコードをコピーすると環境によっては
     一部記号が全角でコピーされるようですので半角になおす
     「"」(ダブルクォーテーション)
     「'」(シングルクォーテーション) 等

    以上で、機能は別として表示自体は上手くいくはずです。
    2017年6月9日 2:50
  • みなさま ありがとうございます!

    「ri0123さん」の回答を参考にさせていただきましたが、それでもコピーができず、

    結局社内のJava Scriptがわかりそうな方に相談しまして、下記の通り対応しましたらできました。

    今後、私のようにJava Scriptがわからない方、初心者でも対応できるように注意点を記録として残しておきます。

    みなさま、いろいろとご協力いただき本当にありがとうございました!

    ★リストに保存済みの内容を編集して別IDで保存する方法(SharePoint Online利用の場合)

    Sharepoint アイテムのコピー」をネット検索しますと、

    一般の(とある企業の)サイト(blog)にやり方が書いてあるので、手順はそちらを参照ください。

    Java Scriptは下記の注意点を参考にされるとよいと思います。

    (JavaScriptご存知の方には初歩かもしれませんが、わからない方のために・・・)

    ★下記のコードを記載する際の書き換え箇所とポイント

    ・「単一データを選択してコピー」:コピー用のボタンができますので、そのボタンに表示させたい内容に書き換え。

    ・「リスト名」:リストの名称を日本語で名前をつけているのであれば、そのまま日本語で書き換え。

    ・「Title」~「Line3」:列の名称を入力するのですが、日本語で列名を設定している場合そのまま入力ではなく内部列名にします。
    ※内部列名の確認方法:実際に入力した内容を開き右クリックで「ソースの表示」
    列の名称をCtrl+Fで検索すると、「"SPBookmark_○○"」と表示されますので、○○の箇所をピックアップ
    ※要注意:「"SPBookmark__○○"」と○○の先頭にもアンダーバーがあることがあるので、コピーし忘れに注意。
    このアンダーバー有無がコピー可否に左右されますので十分注意してください。

    ・列を追加していて10行作成されている場合は、「oListItem.set_item('xxx', currentItem.get_item('xxx'));」が10個ある状態になります。

    ・「コピーしました!」:選択したIDをコピーされると表示されるポップアップメッセージ内の文章なので、適宜変更

    ・「リストのURL」:リストのトップページのURLをここにコピー


    <input type="button" onclick="CopyItem()" value='単一データを選択してコピー'/>
    <script type="text/javascript">
    	var context;
    	var currentItem;
    	var sourceList;
    
    	function CopyItem(){
    		context = SP.ClientContext.get_current();
    		var selectedItemIds = SP.ListOperation.Selection.getSelectedItems(context);
    		var web = context.get_web();
    		sourceList = web.get_lists().getByTitle('リスト名');
    		currentItem = sourceList.getItemById(parseInt(selectedItemIds[0].id));
    		context.load(currentItem);
    		context.executeQueryAsync(Function.createDelegate(this,Endload),
    			Function.createDelegate(this,error));
    	}
    	function Endload(sender, args){
    		var itemCreateInfo = new SP.ListItemCreationInformation();
    		this.oListItem = sourceList.addItem(itemCreateInfo);
    		oListItem.set_item('Title', currentItem.get_item('Title')+'_コピー');
    		oListItem.set_item('Line2', currentItem.get_item('Line2'));
    		oListItem.set_item('Line3', currentItem.get_item('Line3'));
    		oListItem.update();
    		context.executeQueryAsync(Function.createDelegate(this,endCopy),
    		Function.createDelegate(this, error));
    
    	}
    	function endCopy(){
    		alert('コピーしました!\nTitle:' + currentItem.get_item('Title') + '\nID: '+ oListItem.get_id());
    		var url = 'リストのURL?ID=' + oListItem.get_id();
    		location.href = url;
    	}
    	function error(sender, args){
    		alert(args.get_message());
    	}
    </script>
    


    • 回答としてマーク QlsIm 2017年6月19日 5:49
    2017年6月19日 5:45