2

我想创建一个Google Apps脚本,保持谷歌日历和驱动器上的“主电子表格”同步 - 这可能吗?我发现这两个职位:如何同步谷歌日历和电子表格与脚本

我确信这会使用大量的if语句和逻辑来完成,但也许有一个更简单办法?

我刚刚提供了下面的简单脚本。所有这一切真的需要添加基于两列的事件,而这将花费太长的时间来开发。

function onOpen() { 
    //spawns a menu with a button that triggers AddToCal 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var entries = [{ 
    name : "Add event to calendar", 
    functionName : "AddToCal" 
    }]; 
    sheet.addMenu("Data To Calendar Plugin", entries); 
}; 

function AddToCal(){ 

    //get the current row 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var cell = ss.getActiveCell(); 
    var R = cell.getRow(); 

    //grab values for current row to pass to calendar event 
    var date_of_event = ss.getRange('G'+R).getValue(); 
    var date = new Date(date_of_event); 
    var event_title = ss.getRange('A'+R).getValue(); 
    //access the calendar 
    var cal = CalendarApp.getCalendarById('[IDREMOVED]'); 
    cal.createAllDayEvent(event_title,date); 

    ss.toast("Event added to " + cal.getName()); 
    } 

回答

3

是的,它的可能写一个双向事件同步脚本,但它不会很简单。您提到的这两个帖子有可重用的部分,但与实际同步所面临的挑战相比,它们相当基本。您可能想要阅读Using Google Apps Script for a event booking system,它确实基于电子表格创建日历条目(但不会进行正在进行的同步)。我过去做过一些debugging of that script

同步将需要支持:事件的

  • 创作在任一位置
  • 修改的在任一位置的活动详情(虽然你可以选择只考虑为简化事件详细信息的一个子集)
  • 删除任一位置的事件
  • 复发,例如CalendarEvent.getEventSeries()处理(或选择逃避)

这是伪代码,你可以用开始:

Open Calendar, Read Calendar events into calArray (will all attributes you care for) 
Open Spreadsheet, Read Spreadsheet events into sheetArray 

For each event in calArray: 
    Search for calEvent in sheetArray. 
    If found, compare lastUpdated values. 
    If equal, do nothing 
    Otherwise copy most recently updated to least recently updated 
    Continue with next event 
    If not found then copy calEvent to new sheetEvent, including lastUpdated value. 
    Continue with next event 

For each event in the sheetArray (...that hasn't been handled yet) 
    Similar logic above. 

Write updated sheetArray to spreadsheet. 
Write updated calEvents to calendar API (see note 1 below) 

注:

  1. 所有更新calEvents可以到阵列制成并立即写入日历API,作为批量更新的替代方法。这将消除在本地跟踪更改的需求,但触摸lastUpdated值是一个好主意。

  2. 在阅读calEvents时,您会希望使用CalendarEvent.getLastUpdated(),并在电子表格中存储一个类似的值(绑定到onEdit触发器)以便于比较。

  3. 它将简化比较,记录CalendarEvent.getId()对电子表格中的事件。您还可以使用CalendarEvent.setTag(key,value)将自定义元数据记录到日历中,例如,指示已生成或已与电子表格同步的事件。 (这些标签无法通过GCal UI访问,因此只能通过脚本访问。)

  4. 您应该考虑要处理的日期范围或事件数量,并限制脚本的范围。如果你不这样做,你肯定会在实际操作中遇到执行时间限制。

  5. 某些日历事件的特点不适合自己的表达很容易在电子表格中,例如:

    • 嘉宾名单
    • 提醒列表
2

不,没有。虽然有关Apps Script Calendar Service的许多问题已经解决(时区,全天事件,查询等),但它仍然是一项相当复杂的任务。

我知道Serge,the top contributor here in SO关于#google-apps-script标记,已经开发出相当于some scripts的日历服务。

但是我不知道在日历和电子表格之间进行了双向更新。它应该是一个很难的。如果你曾经这样做,请善待分享:)

+0

我不知道如果我最终会写这个剧本,我还是试图理解用例,我可能只需要开发更简单的东西。不管写什么,都会在这里分享 – digitalsteez

4

如前所述(感谢恩里克)在另一篇文章中,我花了一些时间 - 这实际上是我最初把我带到GAS的 - 电子表格和日历之间的数据交换,主要是因为peo我曾经在电子表格中用于组织他们的时间表(高中),我不得不照顾到Google日历的过渡。

过了一段时间,虽然看起来在线日历界面更有效地创建事件,所以他们不再使用日历脚本表!另一方面,GCal中的打印和展示选项非常有限,所以其他方向仍然非常有用,我们一直都在使用它!

我知道这似乎超出了有关原始问题的主题,也许过于轶事,但我只想指出,在重新发明轮子之前,你应该彻底思考你真正需要的东西......正如Mogsdad提到的,某些事件参数在电子表格逻辑中不易描述,最终使用起来比原始工具复杂得多。

唯一真正有用的工具,我用双向数据传输是一个“批量修改工具”当我需要删除或编辑类似事件的一个大数目发展。

例如,如果我们需要改变一个老师的名字出于某种原因,我一年中导入了许多类的所有事件,替换电子表格中的名称并更新回班级日历......它花了我5分钟,很容易,但这些都是非常具体的用例,我不确定这是非常普遍的。

无论如何,我不会称之为“同步”,因为它只需要一些事件一些时间,并改变它们......我从来没有试图保持一个涂料等最新的日历,从我的经验日历是非常可靠的,我认为他们作为原始数据源。正如我已经说过的,我们每周都在电子表格中导入数据,仅用于打印和本地存档。

对不起这么久,有点模糊的评论(这是路太长,不适合在一个正常的500个CHRS评论;-)

相关问题