当前位置: 首页 > 知识库问答 >
问题:

如何从一个谷歌表同步不同的,多日历?

公冶麒
2023-03-14

我想同步/更新不同的日历(iCal的奖励积分,但感谢它可能必须是Google Cal),用于一张Google工作表中的不同客户

从本页:

https://docs.google.com/spreadsheets/d/1f6qUjGYHZtRRGCbyh5oNzM7o64B-wlkrTpB1ac64I2U/edit#gid=0

我希望C、D、E、F、G列中的信息输入到日历条目中,并根据a列中的日期与B列中客户端a、B和C的相应日历同步

因此,对于2017年1月6日的客户A,以下信息将作为全天活动添加:

事件:ABC地点:ABC,DEF,GHI容量:5000座Cap:100链接:www.google。com/abc

客户B在日期08-02-2017,以下内容将被添加到客户B的日历中(但不是客户A的日历等)

事件:ABC地点:ABC,DEF,GHI容量:2500座盖:200链接:www.google.com。com/abd

如您所见,各个客户端及其日历都有多个条目

我已经成功地让singular calendar根据以下链接工作,但需要一个“if/then”规范,不知道它去哪里或使用什么代码

https://cloud.google.com/blog/products/g-suite/g-suite-pro-tip-how-to-automatically-add-a-schedule-from-google-sheets-into-calendar

共有1个答案

万楷
2023-03-14

您需要在某个地方维护客户端到日历ID的映射,以便每次处理事件行时都可以执行以下操作:

var clientEventCal = CalendarApp.getCalendarById(clientCalendarId);

以确保将事件添加到正确的日历中。

注意:如果您共享用于使用电子表格结构在单个日历中创建事件的应用程序脚本代码,我可以提供有关要进行的确切更改的具体说明!

为了概述一个完整的解决方案,让我们假设您创建一个名为“客户端日历”的新工作表,在列A中包含客户端或项目,在列B中包含客户端的谷歌日历ID。

创建此新的客户端到客户端日历ID表后,您有几个选项可以使用它:

  • 选项A:在运行时直接在代码中读取表,并查找要在应用脚本代码中使用的正确日历ID。
  • 选项B:在主数据表中添加一个新列,使用每行的Client列值使用VLOOKUP将日历ID直接填充到源数据行中。

(B) 可能更容易,因为它需要更少的应用程序脚本代码修改。

function createAllDayEvent(calendarId, eventName, date, location, description) {
   var eventCal = CalendarApp.getCalendarById(calendarId);
   var event = eventCal.createAllDayEvent(eventName, date, date, {location: location, description: description});

   return event;
}

function createClientEvents(event) {
  var sheet = event ? event.source.getSheets()[0] : SpreadsheetApp.getActiveSheet();

  var startRow = 4;
  var dataRange = sheet.getRange('A' + startRow.toString() + ':G');
  var data = dataRange.getDisplayValues();

  var clientCalendarSheet = ss.getSheetByName('Client Calendars');
  var clientCalendarData = clientCalendarSheet.getDataRange().getValues();

  // Date (Entry) | Client / Project | Event | Location | Capacity | Seated Cap | Link
  var dateStr, client, eventName, location, capacity, seatedCap, link;

  for (var i = startRow - 1; i < data.length; i++) {
    [dateStr, client, eventName, location, capacity, seatedCap, link] = data[i];
    if (!eventName) continue;

    var calendarId = null;
    for (var j = 0; j < clientCalendarData.length; j++) {
      if (clientCalendarData[i][0] == client) {
        calendarId = clientCalendarData[i][1];
        break;
      }
    }

    var date = new Date(dateStr);
    var description = "Capacity: " + capacity + ", Seated Cap: " + seatedCap + ", Link: " + link;

    createAllDayEvent(calendarId, eventName, date, location, description);
  }
}

此解决方案假设数据表列M包含客户的日历ID(您可以使用=IF($B4=“”,VLOOKUP($B4,'client Calendars'!$A:$B,2,FALSE)填充M)假设您已创建如上所述的“客户日历”表)。

function createAllDayEvent(calendarId, eventName, date, location, description) {
   var eventCal = CalendarApp.getCalendarById(calendarId);
   var event = eventCal.createAllDayEvent(eventName, date, date, {location: location, description: description});

   return event;
}

function createClientEvents(event) {
  var sheet = event ? event.source.getSheets()[0] : SpreadsheetApp.getActiveSheet();

  var startRow = 4;
  var dataRange = sheet.getRange('A' + startRow.toString() + ':G');
  var data = dataRange.getDisplayValues();

  var calendarIdColumn = sheet.getRange('M' + startRow.toString() + ':M').getValues();

  // Date (Entry) | Client / Project | Event | Location | Capacity | Seated Cap | Link
  var dateStr, client, eventName, location, capacity, seatedCap, link;

  for (var i = startRow - 1; i < data.length; i++) {
    [dateStr, client, eventName, location, capacity, seatedCap, link] = data[i];
    if (!eventName) continue;

    var calendarId = calendarIdColumn[i][0];
    var date = new Date(dateStr);
    var description = "Capacity: " + capacity + ", Seated Cap: " + seatedCap + ", Link: " + link;

    createAllDayEvent(calendarId, eventName, date, location, description);
  }
}
 类似资料:
  • 我想同步两个谷歌日历自动每当有一个更新到其中之一。请注意,这两个日历并不相同。我认为设置一个由日历触发的触发器就足够了。但谷歌文档称 这些触发器不会告诉您哪个事件发生了变化或它是如何变化的。相反,它们表示您的代码需要执行增量同步操作,以获取日历的最新更改。 所以我从谷歌找到了一个完全和增量同步的实现 我使用了上面链接中的函数LogSynceEvents()和getRelativeDate(),没有

  • 我有一个python脚本,它将我的一些约会同步到两个不同的谷歌账户,两个账户都有一个谷歌日历,显然设置相同(时区设置也相同),在调用下载约会列表的时候然而,在日历上,调用返回具有不同日期格式的约会,具体取决于我要查询的日历。 使用的库是google开发的库(使用的Python版本是3.6) 脚本(在两种情况下都在同一台计算机上运行)如下所示: 我想这是一些关于日历配置的问题,但是我在设置中没有找到

  • 在GoogleSheets中,我有一个“Source”选项卡,其中单元格“A1”可以从另一个称为“Data”的选项卡上“A1:A5”范围内的5个值列表中选择。同一“源”选项卡上的范围“B1:D3”是动态的,取决于选择的值“A1”。 我想要的是循环遍历“A1”的所有五个值,并从B1:D3范围(9个单元格)复制每组值,然后将它们堆叠在另一个google工作表id:123456和选项卡“sheet1”中

  • 问题内容: 我需要从3个表中获得不同的值。 当我执行此代码时: 我收到一条错误消息,提示我的“城市”一栏不明确。 我也尝试过这个: 有了这段代码,我的表什么都收不到。 让我向您展示我正在尝试做的事的示例: 我需要得到这样的结果 城市的顺序对我来说并不重要,我只需要拥有所有城市,每个城市应该只有一个代表。 任何的想法?我当时想在中使用,但没有连接,所以我不能使用它。 问题答案: 该关键字将返回结果列

  • 我有一个谷歌表单,它将数据收集到电子表格中(表单响应1)。因为我认为有4m行的限制,所以如何以编程方式创建新的工作表并将响应存储到新创建的工作表中。 注意:这不是将响应复制到新工作表中。

  • 我想为谷歌地图上的每个标记创建一个自己的窗口。我尝试了这个: 不幸的是,只有第二个标记有一个包含的窗口。如果我单击第一个标记,那么带有的第二个标记的窗口就会弹出。我不明白为什么会发生这种情况。 我注意到,如果我为第二个标记和第二个窗口使用一个新变量,每个标记都有自己的窗口,如下所示: 但我完全不明白为什么我需要使用新的变量。为什么我不能覆盖旧的变量? 注意:这个问题是关于如何获取多个不同的info