如何在不覆盖公式的情况下将事件 ID 从 google 日历保存到 google 工作表

How to save event id from google calendar to google sheets without overwriting formulas

这是我第一次尝试在 Google 表格中使用脚本。我正在尝试创建一个脚本,该脚本将根据我在 spreadsheet 中的数据创建日历事件。我摘自此处发布的示例。

此代码将从我的 sheet 中提取数据,检查事件是否存在,如果不存在,它将创建事件,如果存在,它将删除事件并创建一个新事件(我需要能够编辑事件的时间)这都是基于事件创建时记录到 sheet 的事件 ID。

这很好用,但是当它记录事件 ID 时,代码将所有数据记录回传播sheet,然后用数据而不是我正在使用的公式覆盖单元格。

如何更新此代码,使其仅更新 eventID 而不是所有内容?

/**
 * 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 lc = sheet.getLastColumn()
  var data = range.getValues();
  var calId = "715rn8uj1trqc31e6mepgsnk7k@group.calendar.google.com";
  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[13];           // Fourteenth 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 = "1117 w 24th Street, Los Angeles, CA 90007";
    var desc = row[14];
    var id = row[15];              // Sisteenth column == eventId
    // Check if event already exists, delete it if it does
    try {
      var event = cal.getEventById(id)
      event.deleteEvent();
      row[15] = '';  // 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[15] = newEvent;  // Update the data array with event ID
    debugger;

// Record all event IDs to spreadsheet
    idrange.setValues(data);
    }

}


function testRange () {

 var sheet = SpreadsheetApp.getActiveSheet();
 var range = sheet.getDataRange();
 logger.log(data);

}

由于 rangerange = sheet.getDataRange(),您会继续阅读并覆盖 sheet 上的所有内容。让我们只写ID。首先,制作一个较小的数据数组,其中只有 Id 列。然后将它放在它所属的 spreadsheet 中:第 16 列(在基于 0 的索引中为 15,但在基于 1 的索引中为 16)。

以下内容应放在for 循环 之后,而不是在其中。

// Record all event IDs to spreadsheet
var id_data = data.map(function (row) {
  return [row[15]];      // keep only that column
});
sheet.getRange(1, 16, id_data.length, 1).setValues(id_data);  // write it in the sheet