亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從電子表格創建Google日歷活動,但防止重復

從電子表格創建Google日歷活動,但防止重復

API
叮當貓咪 2019-10-17 14:04:56
我正在嘗試編寫一個腳本,該腳本將從Google電子表格中獲取數據并在Google日歷中創建事件。我管理得很好,但是每次運行它都會產生重復。因此,現在我試圖通過在電子表格中創建第17列來為每行自動生成唯一的事件ID來防止這種情況,然后每次運行腳本時,腳本都會查看每行的事件ID并刪除相應的事件在日歷中重新創建原始數據或更新后的數據(如果我更改了該行)。我不熟悉任何一種腳本并將它們拼湊在一起,但是現在卻碰壁了。誰能幫忙解決這個問題?function CalInsert() {    var cal = CalendarApp.getDefaultCalendar();    var id = SpreadsheetApp.getActiveSheet().getRange(2,17).getValue();    if (id != 0) {        var event = cal.getEventSeriesById(id);        event.deleteEventSeries();    }    var sheet = SpreadsheetApp.getActiveSheet();    var startRow = 2; // First row of data to process    var numRows = sheet.getLastRow(); // Number of rows to process    var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());    var data = dataRange.getValues();    for (i in data) {        var row = data[i];        var title = row[0]; // First column        var desc = row[13]; // Second column        var tstart = row[14];        var tstop = row[15];        var event = cal.createEvent(title, tstart, tstop, {description:desc});        var eventid = event.getId();        SpreadsheetApp.getActiveSheet().getRange(2,17).setValue(eventid);    }}
查看完整描述

2 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

這與兩天前提出的問題非常相似,該問題涉及將事件電子表格與日歷同步。聽起來您好像想將電子表格視為它所引發的事件的主控者,這將大大簡化問題。該答案涵蓋了您需要做的基本工作。如果您只想修改現有代碼,則下面有一個實現。


我有來自此Blog的代碼的修改版本,該版本將修改預先存在的日歷條目以匹配電子表格中的信息。我對電子表格的排列方式有所不同,這反映在代碼中。


日期| 標題| 開始時間 結束時間| 位置| 描述 事件ID


創建新事件時,腳本會填充事件ID列,然后在以后的調用中使用該事件ID列從日歷中檢索事件,從而避免重復。


腳本

/**

 * Adds a custom menu to the active spreadsheet, containing a single menu item

 * for invoking the exportEvents() function.

 * The onOpen() function, when defined, is automatically invoked whenever the

 * spreadsheet is opened.

 * For more information on using the Spreadsheet API, see

 * https://developers.google.com/apps-script/service_spreadsheet

 */

function onOpen() {

  var sheet = SpreadsheetApp.getActiveSpreadsheet();

  var entries = [{

    name : "Export Events",

    functionName : "exportEvents"

  }];

  sheet.addMenu("Calendar Actions", entries);

};


/**

 * Export events from spreadsheet to calendar

 */

function exportEvents() {

  var sheet = SpreadsheetApp.getActiveSheet();

  var headerRows = 1;  // Number of rows of header info (to skip)

  var range = sheet.getDataRange();

  var data = range.getValues();

  var calId = "YOUR_CALENDAR_ID";

  var cal = CalendarApp.getCalendarById(calId);

  for (i=0; i<data.length; i++) {

    if (i < headerRows) continue; // Skip header row(s)

    var row = data[i];

    var date = new Date(row[0]);  // First column

    var title = row[1];           // Second column

    var tstart = new Date(row[2]);

    tstart.setDate(date.getDate());

    tstart.setMonth(date.getMonth());

    tstart.setYear(date.getYear());

    var tstop = new Date(row[3]);

    tstop.setDate(date.getDate());

    tstop.setMonth(date.getMonth());

    tstop.setYear(date.getYear());

    var loc = row[4];

    var desc = row[5];

    var id = row[6];              // Sixth column == eventId

    // Check if event already exists, update it if it does

    try {

      var event = cal.getEventSeriesById(id);

    }

    catch (e) {

      // do nothing - we just want to avoid the exception when event doesn't exist

    }

    if (!event) {

      //cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});

      var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();

      row[6] = newEvent;  // Update the data array with event ID

    }

    else {

      event.setTitle(title);

      event.setDescription(desc);

      event.setLocation(loc);

      // event.setTime(tstart, tstop); // cannot setTime on eventSeries.

      // ... but we CAN set recurrence!

      var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);

      event.setRecurrence(recurrence, tstart, tstop);

    }

    debugger;

  }

  // Record all event IDs to spreadsheet

  range.setValues(data);

}

刪除/重新創建

在此替代方案中,eventID用于查找和刪除先前存在的事件。之后,將使用電子表格中的數據創建一個新事件。這樣的好處是可以更新事件的所有值,包括開始和停止時間(請參見下面的注釋)。另一方面,對原始事件所做的任何更改都將丟失-例如,如果邀請了其他人參加該事件,或者添加了自定義提醒。


要使用此替代方法,只需將匹配的代碼替換為:


// Check if event already exists, delete it if it does

try {

  var event = cal.getEventSeriesById(id);

  event.deleteEventSeries();

  row[6] = '';  // Remove event ID    

}

catch (e) {

  // do nothing - we just want to avoid the exception when event doesn't exist

}

//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});

var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();

row[6] = newEvent;  // Update the data array with event ID

debugger;

筆記

getEventSeriesById錯誤的文檔指出,null如果沒有找到匹配的事件,它將返回,而拋出異常。(討厭?。┮虼?,我將其封裝在try / catch塊中,以繼續游泳。

不幸的是,當getEventSeriesById檢索事件時,它returns是一個EventSeries不支持該setTime()方法的對象。如果您不希望更改事件的時間,則可以。否則,您可以通過設置重復規則和時間將更Event改為,或者刪除舊事件并創建一個新事件,如Delete / Recreate所示。問題1154。EventSeries

電子表格總是贏。通過Google日歷記錄的任何事件更改(在相關字段中)都會被腳本覆蓋。


查看完整回答
反對 回復 2019-10-17
  • 2 回答
  • 0 關注
  • 703 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號