如何在不覆盖公式的情况下将事件 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);
}
由于 range
是 range = 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
这是我第一次尝试在 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);
}
由于 range
是 range = 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