【问题标题】:Export all events from a shared calendar, including events added by non-owners从共享日历导出所有事件,包括非所有者添加的事件
【发布时间】:2018-08-20 09:46:20
【问题描述】:

我正在尝试将 Google 日历事件数据提取到电子表格中,这很有效。但是,我使用的代码仅导出由 Google 帐户/日历所有者创建的数据,而不是其他用户添加的事件。

下面是我用来访问日历和检索事件详细信息的一些代码示例。

是否有任何方法可以实现上述所有用户添加的详细信息..?

var cal = CalendarApp.getCalendarById("name of calendar");
var events = cal.getEvents(new Date("18/08/2018 12:00 AM"), new Date("30/08/2018 12:00 AM"))

编辑

在我原来的帖子的基础上,这可能会有所帮助..

感谢到目前为止的回复...我不完全确定刚刚引用的代码中发生了什么,我的完整功能如下。如果我给出我正在尝试做的实际示例,它也可能会有所帮助。

一个仓库每天进出许多托盘。这些各种输入/输出的详细信息作为事件添加到“输入”和“输出”日历上。每种操作都有一个日历。详细信息仅输入到“标题”部分(例如采购订单号等)并给出时间。我有将托盘数量放入“描述”部分的想法,这样当我们将事件提取到电子表格中时,我们每天、每小时等都会获得进出托盘的计数。

function goodsin() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cal = CalendarApp.getCalendarById("name of calendar");

  var events = cal.getEvents(new Date("18/08/2018 12:00 AM"), new Date("30/08/2018 12:00 AM"));
  for (var i = 0; i < events.length; i++) {                        
    var title = events[i].getTitle();
    var sd = events[i].getStartTime();
    var ed = events[i].getEndTime();
    var des = events[i].getDescription();

    ss.getRange(i+2, 1).setValue(title)
    ss.getRange(i+2, 2).setValue(sd);
    ss.getRange(i+2, 2).setNumberFormat("dd/mm/yyyy h:mm:ss AM/PM")
    ss.getRange(i+2, 3).setValue(ed);
    ss.getRange(i+2, 3).setNumberFormat("dd/mm/yyyy h:mm:ss AM/PM")
    ss.getRange(i+2, 4).setValue(des);
  }
}

【问题讨论】:

  • 您可能需要使用实际的日历 API 而不仅仅是日历服务CalendarApp。你有没有仔细研究过CalendarApp 方法,看看它们中是否有任何接近提供或建议类似于你要求的东西?因为(对我而言)知道您正在参加或受邀参加的活动应该是可查询的......
  • 感谢您的回复。我已经检查了网页上的列表,看看是否有任何描述与我正在寻找的内容相匹配,但由于我对此有点陌生,所以没有任何东西跳出来。有些方法有选项,但在 [] 字段中。但我不确定在论点中有什么选择......

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


【解决方案1】:

我无法重现您的问题。

“默认”日历中的事件

使用帐户 A,我在其默认日历上创建了一个活动,并邀请了帐户 B。帐户 B 尚未接受邀请。

如果我从账户 B 运行以下代码,我会在 Stackdriver 日志中获取事件信息:

function getNextEvent_(calendars) {
  if (!calendars)
    calendars = CalendarApp.getAllCalendars();
  const now = new Date();
  const end = new Date();
  return calendars.map(function (cal) {
    var weeks = 4;
    end.setTime(now.getTime());
    do {
      end.setDate(end.getDate() + 7)
      var e = cal.getEvents(now, end, {max: 1}).pop();
    } while (!e && --weeks);
    return cal.getName() + ': ' +
      (!e
       ? 'No visible events up to ' + end.toLocaleString()
       : e.getTitle() + ' (Org. by ' + e.getCreators().join(',') + ')'
      );
  });
}
function logNextEvents() {
  console.log({
    message: "Upcoming Events",
    events: getNextEvent_()
  });
}

如果我深入挖掘,会发现帐户 B 的默认日历的事件,即 CalendarApp.getDefaultCalendar().getEvents(...) 包含帐户 A 拥有和组织的事件。

共享日历中的事件

设置:

  1. 帐户 A 创建了一个新的 Google 日历。
  2. 帐户 B 已添加并有权更改事件。
  3. 帐户 C 已添加,具有更改事件的权限。
  4. 所有帐户都在日历上创建一个事件(创建了 3 个事件)。

代码:

function querySharedCal() {
  const id = 'notarealgroupid@group.calendar.google.com';
  const cal = CalendarApp.getCalendarById(id);
  if (!cal) throw new Error("no calendar");
  const now = new Date();
  const end = new Date();
  end.setDate(end.getDate() + 4);
  const events = cal.getEvents(now, end).map(function (e) {
    return cal.getName() + ': ' + e.getTitle() + 
      ' (Org. by ' + e.getCreators().join(',') + ')';
  });
  console.log({message:"search result by " + Session.getTemporaryActiveUserKey(), events: events});
}

案例:

  • 账户A运行上述代码
  • 账户 B 运行上述代码
  • 账户 C 运行上述代码

结果:

  • 所有案例都返回 3 个事件。即使账户 a、b、c 各自编写自己的代码(而不是每个人都可以执行一个项目),所有查询都是成功的。

关于日历的权限级别、创建事件的帐户、事件可见性以及执行查询的帐户,您可能没有与我们分享某些内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多