今回は、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」を更新しています。
では!