他のユーザのカレンダーを自分のカレンダーに表示しようと思うと画面からユーザを選んでの設定になります。
これを自動化できないかという質問がありました。
調べてみると同じ質問が見つかりましたが、できないという回答でしたね。
本当なのか?
調べてみるとカレンダーの共有時には
CalendarView オブジェクトが追加されていることが分かりました。
また、このオブジェクトの説明にはちゃんとApexで追加する例題がありましたね。
Group userGroup = [SELECT Id FROM Group WHERE Name = 'Sales Group' LIMIT 1];
List<Id> groupId = new List<Id>();
groupId.add(userGroup.id);
List<GroupMember> groupMembers = [SELECT UserOrGroupId FROM GroupMember
WHERE GroupId IN: groupId];
List<CalendarView> calendarViews = new List<CalendarView>();
for (GroupMember groupMember : groupMembers) {
CalendarView calendarView = new CalendarView(name = 'Opportunity Close
Dates', SobjectType = 'Opportunity', StartField = 'CloseDate', DisplayField =
'Name', OwnerId = groupMember.UserOrGroupId);
calendarViews.add(calendarView);
}
insert calendarViews;
では、これを参考に作りましょう。
public with sharing class addCalendarView {
public static Boolean addRecord() {
SET<String> targetUserSet = new SET<String>();
//ここに必要なユーザ名をセットする
targetUserSet.add('xxxxx@brave-hawk-3moqt3.com');
targetUserSet.add('cbrown@apblue44210807.com');
List<User> targetUserList = [SELECT Id, UserName,LastName,FirstName FROM User WHERE UserName =: targetUserSet];
List<CalendarView> insertCalendarViewList = new List<CalendarView>();
for (User u : targetUserList){
for (User u2 : targetUserList){
if ( u.Id <> u2.Id) {
CalendarView cw = new CalendarView();
cw.Name = u.FirstName + ' ' + u.LastName;
cw.SobjectType = 'Event';
cw.StartField = 'StartDateTime';
cw.DisplayField = 'Subject';
cw.OwnerId = u2.Id;
insertCalendarViewList.add(cw);
}
}
}
if( insertCalendarViewList.size() > 0) insert insertCalendarViewList;
return true;
}
}
テストクラス
@isTest
public class addCalendarView_test {
@isTest
public static void test01() {
Test.startTest();
addCalendarView.addRecord();
Test.stopTest();
List<CalendarView> targetCalendarViewList = [select Id,Name,SobjectType,StartField ,DisplayField,OwnerId FROM CalendarView];
System.assertEquals(targetCalendarViewList.size(), 2);
}
}
実際に処理できましたが、何故かMy Calendarsに分類されてしまいました。
元の質問