【问题标题】:How to create an event on every organisation member calendar?如何在每个组织成员日历上创建事件?
【发布时间】:2019-03-29 02:52:56
【问题描述】:

我需要在我组织的每个人的日历中创建一个活动。这个事件是提醒每个人在某个日期之前需要采取的行动,但是这个日期每个月都不一样,所以我不能做一个重复的事件。我不想将每个人都添加为与会者,因为我希望每个人都将活动保留在日历上,而不仅仅是回答“不参加”而忘记在适当的时候做他们需要做的事情。

为此,我已经编写了一个代码,该代码从组织中获取每个活动帐户,从谷歌表格中获取开始日期、结束日期、活动标题和活动描述。它适用于我的日历和我在谷歌日历的“其他日历”列表中手动添加的人的日历。但该脚本不会在我的组织中未出现在我的“其他日历”列表中的人员的议程中创建事件。

function getAllPeopleFromDirectory() {
 var pageToken;
 var page;
 var usersId = [];
 do {
   page = AdminDirectory.Users.list({
     domain:'mydomain.com',
     orderBy: 'givenName',
     maxResults: 400,
     query: "orgUnitPath=/ isSuspended=False",
     pageToken: pageToken
   });
   var users = page.users;

   if(users) {
     for (var i=0; i< users.length; i++) {
       var user = users[i];
       usersId.push(user.primaryEmail);
     }
   } else {
     Logger.log('No users found.');
   }
   pageToken = page.nextPageToken;
 } while(pageToken);
  if (usersId.length != 0){
    setUpReminder(usersId);
  }
}

function setUpReminder(calendarIDs) {
  var ss = SpreadsheetApp.openById("SPREADSHEET_ID");
  var sheet = ss.getSheetByName('reminder');
  var range = sheet.getDataRange();
  var values = range.getValues();
  for (var i = 0; i < calendarIDs.length; i++) {
    setUpCalendar(values, range, calendarIDs[i]);
  }
}

function setUpCalendar(values, range, calendarId) {
  var cal = CalendarApp.getCalendarById(calendarId);
  for (var i = 1; i < values.length; i++) {
    var session = values[i];
    var date = new Date(session[1]);
    var now = new Date();
    if (date.getMonth() == now.getMonth()) {
      var title = session[4];
      var start = joinDateAndTime(session[1], session[2]); 
      var end = joinDateAndTime(session[1], session[3]);
      var options = {location: session[5], sendInvites: false, description: session[8]};
      var event = cal.createEvent(title, start, end, options).setGuestsCanSeeGuests(true);
    }
  }
  range.setValues(values);
}

function joinDateAndTime(date, time) {
  date = new Date(date);
  date.setHours(time.getHours());
  date.setMinutes(time.getMinutes());
  return date;
}

当我与不在我其他日历上的所有人调用“CalendarApp.getCalendarById”时,该函数返回 null,因此 cal.createEvent 引发错误...

有人知道如何正确地做到这一点吗? 也许我可以在每次运行脚本时在我的其他日历中添加和删除人员,这不是最好的解决方案,但如果有人知道如何做到这一点,那就太酷了!

【问题讨论】:

    标签: google-apps-script google-calendar-api


    【解决方案1】:

    与其获取特定于用户的(主要)日历并使用事件逐个更新它们,更好的方法是创建一个自定义日历(也称为辅助日历),该日历在您的 GSuite 域下的所有用户之间共享.

    这是Calendar API reference documentation的摘录:

    ...您可以显式创建任意数量的其他日历;这些日历可以在多个用户之间修改、删除和共享

    因此,您只需更新辅助日历,其事件就会反映在您用户的日历视图中(但前提是您的用户启用了自定义日历)。

    【讨论】:

    • 谢谢,但问题是“只有当您的用户启用了自定义日历时”。我们希望防止日历被禁用,这就是我们要在每个人的日历中创建事件的原因。
    • @nicar 用户可以禁用他们的任何一个日历,包括他们的主日历。因此,如果他们愿意,您无法阻止他们禁用它。
    猜你喜欢
    • 1970-01-01
    • 2022-10-06
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多