使用这段代码,我可以将事件从google电子表格放到google日历中,但是现在我要通过存储在电子表格中的唯一ID在两个平台之间同步这些事件。
首先,我试图每5分钟设置一个触发器,但我不知道这是否是最好的解决方案,也考虑到工作表上的事件超过300个(它们可能会增加,但每天有5或6个新事件),所以我会避免错误错误:"你已经在短时间内创建或删除了太多的日历或日历事件。">
我想做的第二件事是调用id从谷歌日历到工作表的列A,但没有成功。
我该如何继续?
function sendToCal() {
var spreadsheet = SpreadsheetApp.getActive().getSheetByName('XCALENDAR')
let eventCal = CalendarApp.getCalendarById("xxx");
var signups = spreadsheet.getRange("A2:M").getValues();
for (x = 0; x < signups.length; x++) {
var shift = signups[x];
let d = shift[3]
let e = shift[4].split(":")
let f = shift[5]
let g = shift[6].split(":")
var startTime = new Date(d.getFullYear(),d.getMonth(),d.getDate(),parseInt(e[0]),parseInt(e[1]),0);
var endTime = new Date(f.getFullYear(),f.getMonth(),f.getDate(),parseInt(g[0]),parseInt(g[1]),0);
var nameevent = shift[1];
var desc = shift[11];
var color = shift[12];
var event = eventCal.createEvent(nameevent, startTime, endTime, { description: desc });
if (color) {
event.setColor(CalendarApp.EventColor[color]);
}
}
}
尝试使用有限的注册(使用getLastRow())和getDisplayValues()来防止格式问题(假设您的日期是dd/MM/yyyy)
function sendToCal() {
var spreadsheet = SpreadsheetApp.getActive().getSheetByName('XCALENDAR')
let eventCal = CalendarApp.getCalendarById("xxx");
var signups = spreadsheet.getRange("A2:M" + spreadsheet.getLastRow()).getDisplayValues();
for (x = 0; x < signups.length; x++) {
var shift = signups[x];
if (shift[0]==''){
let d = shift[3].split("/")
let e = shift[4].split(":")
let f = shift[5].split("/")
let g = shift[6].split(":")
var startTime = new Date(parseInt(d[2]), parseInt(d[1])-1, parseInt(d[0]), parseInt(e[0]), parseInt(e[1]), 0)
var endTime = new Date(parseInt(f[2]), parseInt(f[1])-1, parseInt(f[0]), parseInt(g[0]), parseInt(g[1]), 0)
var nameevent = shift[1];
var desc = shift[11];
var color = shift[12];
var event = eventCal.createEvent(nameevent, startTime, endTime, { description: desc });
spreadsheet.getRange('A' + (+x + 2)).setValue(event.getId())
if (color) {
event.setColor(CalendarApp.EventColor[color]);
}
}
}
}
嗯,
如果我理解正确的话,您希望有一个事件表,每个事件都有自己的标识符,并确保它们始终同步。
如果这是正确的,我的建议是只使用事件ID作为您在工作表上的标识符,当运行脚本时,仅针对工作表中的事件而不使用标识符。
获取事件ID,简单如下:
// var event = eventCal.createEvent(nameevent, startTime, endTime, { description: desc });
const eventID = eventCal.createEvent(nameevent, startTime, endTime, { description: desc }).getId();
你可以把它附加在你喜欢的地方,不过我认为第一列或第二列是最好的。
试题:
function sendToCal() {
const spreadsheet = SpreadsheetApp.getActive().getSheetByName('XCALENDAR')
const eventCal = CalendarApp.getCalendarById("xxx");
const signups = spreadsheet.getRange("A2:M").getValues();
const targetEvents = signups.filter(i => i[0] === ``);
for (let newEvent of targetEvents) {
const rowIndex = signups.findIndex(i => i === newEvent);
const [d, e, f, g] = [newEvent[3], newEvent[4].split(":"), newEvent[5], newEvent[6].split(":")];
const [nameevent, desc, color] = [newEvent[1], newEvent[11], newEvent[12]];
const startTime = new Date(d.getFullYear(),d.getMonth(),d.getDate(),parseInt(e[0]),parseInt(e[1]),0);
const endTime = new Date(f.getFullYear(),f.getMonth(),f.getDate(),parseInt(g[0]),parseInt(g[1]),0);
const eventID = eventCal.createEvent(nameevent, startTime, endTime, { description: desc }).getId();
const updatedRow = [eventID, ...newEvent];
spreadsheet.getRange(rowIndex+2, 1, 1, updatedRow.length).setValues([updatedRow])
if (color) {
event.setColor(CalendarApp.EventColor[color]);
}
}
}
主要变化如下:
- 增大原始
signups
范围 - 仅针对没有ID的事件(
targetEvents
)。 - 由于新的ID列,所有索引值增加1。
- 在创建事件后更新行以包含ID。
如果您有任何问题请告诉我!