2016-09-16 10 views
0

次のシナリオを実行していますが、どのように取り組むべきかわかりません。SharePointリストアイテム:あるアイテムから別のアイテムにリストアイテムレベルのアクセス許可をコピーする

リストアイテムレベルの権限をあるリストアイテムから別のリストアイテムにコピーする必要があります。つまり、

リストAには、のアイテムAという名前のアイテムが含まれています。リストBには、のアイテムBという名前のアイテムが含まれています。私は、itemAのitem-level許可をitemBに複製したいと考えています。

誰でもこれを行う方法を知っていますか?これは、JSOMを使用するフロントエンドコード、またはワークフロー(2010または2013)で行うことができます。私はすでに試した

もの:

  • "継承親の許可" ワークフローアクション。ただし、リスト自体からではなく、別のリスト項目からワークフローのアクセス許可を継承したいとします。
  • 私のシナリオはこれと似ています:Inheriting list item permissions via permissions on lookup field item。私はJSOMやワークフローのソリューションを探しているので、イベントレシーバを構築する能力はありません。

答えて

1

次の例では、SharePoint JSOM APIを経由して、リスト項目の権限をコピーする方法を示しています

前提条件:

固有の権限は、ソースとターゲットリストの項目のために割り当てられている必要があり

SP.SOD.executeFunc('SP.js', 'SP.ClientContext', 
function(){ 
    var ctx = SP.ClientContext.get_current(); 
    var sourceListItem = ctx.get_web().get_lists().getByTitle("InTasks").getItemById(1); 
    var targetListItem = ctx.get_web().get_lists().getByTitle("OutTasks").getItemById(1); 
    copyListItemPermissions(sourceListItem,targetListItem, 
     function(){ 
     console.log("Done"); 
     }, 
     function(sender,args){ 
     console.log(args.get_message()); 
     } 
    ); 
}); 

function copyListItemPermissions(sourceListItem,targetListItem,success,error) 
{ 
    var ctx = targetListItem.get_context(); 
    var sourceItemPermissions = sourceListItem.get_roleAssignments(); 
    var targetItemPermissions = targetListItem.get_roleAssignments(); 
    ctx.load(sourceItemPermissions,'Include(Member)'); 
    ctx.load(targetItemPermissions,'Include(Member)'); 
    ctx.executeQueryAsync(
     function(){ 

      targetItemPermissions.get_data().forEach(function(targetAssignment){ 
       targetAssignment.deleteObject(); 
      }); 

      sourceItemPermissions.get_data().forEach(function(sourceAssignment){ 
       var principal = sourceAssignment.get_member(); 
       if(principal.get_principalType() == 1) 
        targetItemPermissions.add(principal,sourceAssignment.get_roleDefinitionBindings()); 
       else if (principal.get_principalType() == 8){ 
        var group = ctx.get_web().get_siteGroups().getById(principal.get_id()); 
        targetItemPermissions.add(group,sourceAssignment.get_roleDefinitionBindings()); 
       }  
      }); 
      targetListItem.update(); 
      ctx.executeQueryAsync(
       function(){ 
        success();  
       }, 
       error 
      );    
     }, 
     error 
    ); 
} 
+0

ありがとうございます!これはほとんどのトリックを行うようです。しかし、コードを試してみると、このJavaScriptエラーが発生します: 'id:11のプリンシパルが見つかりません。 ' アイデア? –

関連する問題