我修改了this question的代码以满足我的需求。我使用填写Google表格的Google表单,然后该脚本会在Google日历中插入一个事件。我已经安装了一个“表单提交”触发器来执行脚本。我遇到的问题是我的代码从工作表第一行的数据开始,每次添加新的表单响应时都添加相同的事件。
这是我的版本:
//push new events to calendar
function pushToCalendar() {
//spreadsheet variables
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();
var range = sheet.getRange(2,1,lastRow,16);
var values = range.getValues();
//calendar variables
var defaultCalendar = CalendarApp.getDefaultCalendar()
var numValues = 0;
for (var i = 0; i < values.length; i++) {
//check to see if Start DateTime and End DateTime are filled out
if ((values[i][3]) && (values[i][4])) {
//check if it's been entered before
if (values[i][6] != 'y') {
//create event https://developers.google.com/apps-script/class_calendarapp#createEvent
var newEventTitle = values[i][1] + ' - ' + values[i][2];
var startDay = Utilities.formatDate(new Date(values[i][3]), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
var endDay = Utilities.formatDate(new Date(values[i][4]), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
var newEvent = defaultCalendar.createEvent(newEventTitle, new Date(startDay), new Date(endDay), {location: values[i][2]});
//get ID
var newEventId = newEvent.getId();
//mark as entered, enter ID
sheet.getRange(i + 2, 6).setValue('y');
sheet.getRange(i + 2, 7).setValue(newEventId);
}
}
numValues++;
}
}
答案 0 :(得分:1)
自己找到解决方案:在第20行我改变了代码
if (values[i][6] != 'y') {
到
if (!values[i][6]) {
无需写出'y'
符号。我也改变了
sheet.getRange(i+2,6).setValue('y');
要 sheet.getRange第(i + 2,6).setValue(&#39;&#39);
不再重复了。代码完美无缺!
答案 1 :(得分:0)
原始代码的问题是您读取的列错误-JavaScript数组的基数为0,而电子表格的列数为1。第6列(来自getRange(i + 2, 6)
位于数组索引5
中,即values[i][5]
,而不是values[i][6]
。因此,您将newEventId
与字符串{{1 }},这永远不会一样。
如您的解决方案所示,删除以下条件:'y'
(又名第7列,脚本在其中写入创建的事件的ID)不等于values[i][6]
(条件始终为true),并且相反,测试任何值将适当地保护事件创建代码。考虑到事件ID列的存在,完全不需要写入'y'
的列。
如果您从表单响应表中删除该列,则代码保护将为:
'y'