我有一个Google表格文档,其中电子表格中的每个表格都指向不同的文件。范围B3:E5始终用于关键截止日期,日期和相关的Google日历条目,如下所示:
B3:C3 (merged): Description; D3: Date; E3: [randomnumbers]@google.com
B4:C4 (merged): Description; D4: Date; E4: [randomnumbers]@google.com
B5:C5 (merged): Description; D5: Date; E5: [randomnumbers]@google.com
我有一个脚本,用于检查该范围的E列中引用的日历条目,如果不存在则创建一个,或者更新条目(如果存在),其中包含来自B:D中日期和描述的信息。它是Create Google Calendar Events from Spreadsheet but prevent duplicates的最佳答案的修改形式。
我的问题是那些细胞并不总是包含信息(例如,我可能在第3行和第5行中有信息,但在第4行中没有信息)。在这种情况下,脚本仍会创建三个日历条目,但与空条目相关联的条目(例如第4行中的条目)设置为" 1969年12月31日和#34;。
我想建立一种方法来捕捉这些空日期(或错误的日期,其中脚本可以正确地将D列解释为日历条目的日期,例如创建拼写错误的日期" Apriil 4,2018",也产生1969年12月31日的条目),如果输入错误或者没有创建没有数据条目的事件,则输出错误。
这是我的剧本,里面有一些评论。我非常感谢你们给予的任何帮助。强制性的#34;不是特别精通Javascript,因此我经常笨拙的Google-fu"。
function exportEvents() {
var sheet = ss.getActiveSheet();
var range = sheet.getRange(3, 2, 3, 4); // Range: Key Deadlines Description and Dates (B3:E6)
var fileno = sheet.getSheetName();
var data = range.getValues();
var calID = "[calIDinformation]@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calID);
var formulas = sheet.getRange(3, 2, 1, 3).getFormulas(); // Snagging one line of formulae which get broken in this process; tofix?
for (i=0; i<data.length; i++) {
var row = data[i];
var description = row[0]; // First column (B - "Description")
var date = new Date(row[2]); // Third column (D - "Date")
var id = row[3]; // Fourth column (E - Dates, written in white)
// Check if event already exists, update it if it does
try {
var event = cal.getEventById(id);
}
// Catches an exception if no event exists
catch (e) {
}
if (!event) {
var newEvent = cal.createAllDayEvent(fileno+' - '+description, date).getId();
row[3] = newEvent; // Update the data array with event ID
}
else {
event.setTitle(fileno+' - '+description);
event.setAllDayDate(date);
}
debugger;
}
// Record all event IDs to spreadsheet and restore formulas in first row
range.setValues(data);
sheet.getRange(3, 2, 1, 3).setFormulas(formulas);
}
答案 0 :(得分:0)
您可以将以下代码添加到循环中以跳过无效日期
if(date.toString() == "Invalid Date")
continue;
基本上,documentation语句会导致循环跳过该迭代。
注意:这适用于日期中的空白或拼写错误(但尚未测试所有可能的结果)
您的最终代码如下所示:
function exportEvents() {
var sheet = ss.getActiveSheet();
var range = sheet.getRange(3, 2, 3, 4); // Range: Key Deadlines Description and Dates (B3:E6)
var fileno = sheet.getSheetName();
var data = range.getValues();
var calID = "[calIDinformation]@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calID);
var formulas = sheet.getRange(3, 2, 1, 3).getFormulas(); // Snagging one line of formulae which get broken in this process; tofix?
for (i=0; i<data.length; i++) {
var row = data[i];
var description = row[0]; // First column (B - "Description")
var date = new Date(row[2]); // Third column (D - "Date")
if(date.toString() == "Invalid Date")
continue; // Skip remaining loop for this iteration
var id = row[3]; // Fourth column (E - Dates, written in white)
// Check if event already exists, update it if it does
try {
var event = cal.getEventById(id);
}
// Catches an exception if no event exists
catch (e) {
}
if (!event) {
var newEvent = cal.createAllDayEvent(fileno+' - '+description, date).getId();
row[3] = newEvent; // Update the data array with event ID
}
else {
event.setTitle(fileno+' - '+description);
event.setAllDayDate(date);
}
debugger;
}
// Record all event IDs to spreadsheet and restore formulas in first row
range.setValues(data);
sheet.getRange(3, 2, 1, 3).setFormulas(formulas);
}
编辑:
要分别评估空白和拼写错误,您可以插入如下代码:
if(date.toString() == "Invalid Date"){
if(row[2].trim() == ""){ //if the cell is blank skip it
continue;
} else { //If the date entered is wrong, highlight it red
range.getCell(i+1,3).setBackground("Red")
continue;
}
}
这将跳过空白并突出显示无效日期的单元格(红色)。