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



这是我第一次尝试在Google表中使用脚本。我正在尝试创建一个将根据我的电子表格中的数据创建日历事件的脚本。我从这里发布的示例中拉出。

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

这效果很好,但是当它记录事件ID时,代码将所有数据记录回电子表格,然后将所有数据记录到电子表格中,然后用数据覆盖单元格,而不是我使用的公式。

如何更新此代码,以便它仅更新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(),您一直在读取和覆盖工作表上的所有内容。让我们只写ID。首先,制作较小的数据数组,仅具有ID列。然后将其放入它所属的电子表格中:在第16列中(在0基于0的索引中为15个,但在1个基于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 

最新更新