2017年7月10日月曜日

Chatterグループ参加メンバーの通知頻度を一括更新する



今回は、Chatterグループ参加メンバーの通知頻度を一括更新する画面を作成してみました。

Salesforceのヘルプでは、以下のリンクで案内されています。

Chatterグループについてのユーザごとの通知頻度の設定


なになに・・、データローダを使用することにより、一括更新が可能・・
ユーザデータをExportして、ChatterグループのExportして、
Chatterグループについてのユーザごとの通知頻度の設定をして、
※「NOTIFICATIONFREQUENCY」の値を目的の値に変更します。
P:Email on each post(各投稿のメール)
D:Daily digests(毎日のダイジェスト)
W:Weekly digests(毎週のダイジェスト)
N:Never(受信しない)

その後、データローダで一括アップロード・・


めんどい

ということで、Visualforce画面を作成してみました。
以下、プログラムです。ダブルクリックすると全選択できます。
コピーしてご自由にお使いください。
※内部的な話としては、AJAX Toolkitを利用しています。
Visualforce内で処理が完結。
コントローラ処理の記述はないため、テストコードは不要。すぐにリリースできます。

<apex:page>
 <script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.2.min.js"></script>
 <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
 <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
 <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/themes/smoothness/jquery-ui.css" />
 <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" />
    <script type="text/javascript">
     var __sfdcSessionId = '{!GETSESSIONID()}';
     var __limit = 10;
     var __offset = 0;
    </script>
    <script src="../../soap/ajax/40.0/connection.js" type="text/javascript"></script>
    <script type="text/javascript">
     $(document).ready(function(){
      setupPage();
     });

     // 
     function setupPage() {

      var queryString = "";
      queryString += "Select Id, Name, Description, CollaborationType, MemberCount, LastFeedModifiedDate From CollaborationGroup";
      var inputChatterGroupName = document.getElementById("chatterGroupName").value;
      if (inputChatterGroupName != "") {
       queryString += " Where ";
       queryString += " Name like '%" + sanitize(inputChatterGroupName) + "%'";
      }
      queryString += " order by Name";
      queryString += " LIMIT " + __limit;
      queryString += " OFFSET " + __offset;
   var queryResult = sforce.connection.query(queryString);   
        var output = "";
   if (queryResult.size > 0) {

       //get the records array
         var records = queryResult.getArray('records');

       //loop through the records and construct html string
         for (var i = 0; i < records.length; i++) {
           var collaborationGroup = records[i];
           output += '<tr>';
           output += '<td><a href="/' + collaborationGroup.Id + '" target="_blank">' + collaborationGroup.Name + '</a></td>';
           output += '<td>' + collaborationGroup.Description + '</td>';
           output += '<td>' + collaborationGroup.CollaborationType + '</td>';
           output += '<td>' + collaborationGroup.MemberCount + '</td>';
           output += '<td>' + collaborationGroup.LastFeedModifiedDate + '</td>';
           output += '<td>';
           output += '<button type="button" class="btn" onclick="bulk_update(\'' + collaborationGroup.Id + '\', \'D\');">D</button>';
           output += '<button type="button" class="btn" onclick="bulk_update(\'' + collaborationGroup.Id + '\', \'W\');">W</button>';
           output += '<button type="button" class="btn" onclick="bulk_update(\'' + collaborationGroup.Id + '\', \'N\');">N</button>';
           output += '<button type="button" class="btn" onclick="bulk_update(\'' + collaborationGroup.Id + '\', \'P\');">P</button>';
           output += '</td>';
           output += '</tr>';
         }
   } else {
    output += '<tr>';
          output += '<td colspan="2">No Search Results</td>';
       output += '</tr>';
   }

      //render the generated html string
   document.getElementById("output").innerHTML = output;

    }

  function search() {
   __offset = 0;
   setupPage();
  }

  function prevPage() {
   if (__offset > 0) {
    __offset = __offset - __limit;
   }
   setupPage();
  }

  function nextPage() {
   __offset = __offset + __limit;
   setupPage();
  }

    //
    function bulk_update(targetId, type) {
      var queryString = "SELECT Id, NotificationFrequency from CollaborationGroupMember Where CollaborationGroupId = '"+ targetId + "'";
   var queryResult = sforce.connection.query(queryString);

   if (queryResult.size > 0) {
    var records = queryResult.getArray('records');
    alert(records);

    var updateRecords = [];
    for (var i = 0; i < records.length; i++) {
     var collaborationGroupMember = records[i];
     var sobject = new sforce.SObject("CollaborationGroupMember");
             sobject.Id = collaborationGroupMember.Id;
             sobject.NotificationFrequency = type;
             updateRecords.push(sobject);
    }

    updateResults = sforce.connection.update(updateRecords);
    messages = getErrorMessages(updateResults);
      if (messages.length > 0) {
       alert(messages.join("\n"));
        return;
      } else {
       alert('success');
      }
     }
    }

    function getErrorMessages(results) {
      var messages = [],
         i = 0,
         len = results.length,
         r;
      for (; i < len; i++) {
         r = results[i];
         if (! r.getBoolean("success")) {
           messages = messages.concat(getMessagesOfAResult(r));
         }
      }
      return messages;
    }


    function sanitize(val) {
     val = val.replace(/\"/g, '\\\"');
     val = val.replace(/\'/g, "\\\'");
     return val;
    }

   </script>
   <form class="form-inline">
    <div class="form-group">
      <label for="name">ChatterGroupName</label>
      <input type="text" class="form-control" id="chatterGroupName"/>
    </div>
    <button type="button" class="btn" onclick="search();">Search</button>
 </form>
 <a href="#" onclick="prevPage();">prevPage</a>  <a href="#" onclick="nextPage();">nextPage</a>
 <br/>
 <table class="table table-bordered table-condensed table-striped">
  <thead>
  <tr>
     <th>Name</th>
     <th>Description</th>
     <th>Collaboration<br/>Type</th>
     <th>Member<br/>Count</th>
     <th>LastFeed<br/>ModifiedDate</th>
     <th>Member NotificationFrequency Action<br/>(D—Daily,W—Weekly,N—Never,P—On every post)</th>
  </tr>
   </thead>
  <tbody id="output">
  </tbody>
 </table>
</apex:page>


Salesforceにシステム管理者権限でログインします。
設定画面を開いて、検索ボックスに「Visualforce」と入力、[Visualforceページ]をクリックします。
※[ビルド]→[開発]→[Visualforceページ]でもOKです。

Visualforce ページ画面が表示されます。新規ボタンをクリック。
以下を入力して、保存ボタンをクリック。
表示ラベル:GroupMemberUpdate
名前:GroupMemberUpdate
Visualforce Markupタブにコードをコピペ

プレビューボタンをクリックすると、動作確認できます。
画面を表示すると、Chatterグループが一覧表示されます。
Chatterグループ毎に、「D」「W」「N」「P」のボタンをクリックすると、
そのChatterグループに参加しているユーザ全員の通知頻度を一括更新します。


各ボタンは、以下で一括更新します。
D:Daily digests(毎日のダイジェスト)
W:Weekly digests(毎週のダイジェスト)
N:Never(受信しない)
P:Email on each post(各投稿のメール)

内部処理的な話としては、
対象のCollaborationGroupに関連するCollaborationGroupMemberオブジェクトの項目「NotificationFrequency」を更新しています。

では!

0 コメント:

コメントを投稿