[英]Creating a Google Calendar Event with Google Sheets script has Errors
我很接近,但我的逻辑不太奏效。 我可以在 Google 表格脚本中运行下面的代码,为表格中的每一行创建一个日历事件。 我试图让它只在输入新行时创建一个事件,并且只读取电子表格直到第一列/行为空/空。 在此处输入图像描述
这是相关的代码:
function createCalendarEvent() {
var sheet = SpreadsheetApp.getActiveSheet();
var calendar = CalendarApp.getCalendarById('dentaldigitaldesign.bkp@gmail.com');
var startRow = 100; // First row of data to process - 100 exempts my header row and adds to the case number count.
var numRows = sheet.getLastRow(); // Number of rows to process
var numColumns = sheet.getLastColumn();
var dataRange = sheet.getRange(startRow, 1, numRows-1, numColumns);
var data = dataRange.getValues();
var complete = "TRUE";
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var caseID = row[0]; //Case ID Number
var patient = row[4]; //Patient Name
var doctor = row[5]; //Doctor
var contact = row[14]; //Doctor contact info
var tooth = row[15]; //Tooth number
var shade = row[10]; //Tooth Shade
var notes = row[8]; //Notes
var callNotes = row[7]; //Call notes if there are any
var timeStamp = new Date (row[2]); //Retrieve the timestamp field
// year as 4 digits (YYYY)
var year = timeStamp.getFullYear();
// month as 2 digits (MM)
var month = ("0" + (timeStamp.getMonth() + 1)).slice(-2);
// date as 2 digits (DD)
var day = ("0" + timeStamp.getDate()).slice(-2);
var dueDate = new Date(month + day, + year); //Due date
var rDate = new Date(row[2]-1); //Remind date
var caseComplete = row[3]; //Case marked as complete
if (caseComplete !== complete && caseID !== null) {
var currentCell = sheet.getRange(startRow + i, numColumns);
calendar.createEvent(patient, rDate, rDate, {
description: doctor + '\r' + patient + '\r' + contact + '\r' + dueDate + '\r' + tooth + '\r' + shade + '\r' + notes + '\r' + callNotes
});
currentCell.setValue(complete);
}
}
}
创建这些事件时,它们都是为上午 8:59 创建的。 理想情况下,如果为那个时间设置了一个事件,我可以检查日历,然后立即添加一个新事件。 (可能在 15 分钟或 30 分钟的时间段内)。 就目前而言,我可以很好地获得有关到期病例的提醒,但最终邀请医生让他们知道到期日可能也很有效。
我还可以使用帮助来格式化描述字段,因为它不会推送返回值并且所有内容都在一行中。
最后,该脚本继续在所需行的 scope 之外的许多字段上运行,最终以脚本失败告终,因为在太短的时间内创建了太多的事件尝试。 (所有对空字段的尝试都不会导致创建任何事件,但这是一个资源问题……谁知道也许谷歌最终会阻止我?)
我感谢可以提供的任何帮助。
这是 Google 表格的链接。 上面没有敏感数据,因为它只是测试数据: https://docs.google.com/spreadsheets/d/1M9qYzSl1PnRv-GehHEYvpiag15UI_GjnanA0wgA4xmg/edit?usp=sharing
您的代码存在多个问题,导致此表达式始终返回true
,因此脚本会尝试为每一行创建一个事件:
if (caseComplete !== complete && caseID !== null) {
您想要检查 A 列中的单元格是否为空(即,其值是否为空字符串),为此您将其值与null进行比较。 null
与空字符串不同,因此以下表达式将始终为true
(单元格值永远不会返回null
):
caseID !== null
您应该将其与空字符串进行比较。 例如,像这样:
caseID !== ""
所以if
语句应该是:
if (caseComplete !== complete && caseID !== "") {
创建事件后,您希望将D
中的相应单元格设置为TRUE
。 您没有这样做,因为您在设置currentCell
时指定了工作表 ( numColumns
) 中的最后一列:
var currentCell = sheet.getRange(startRow + i, numColumns);
因此, D
中的值永远不会更改为TRUE
,因此caseComplete !== complete
始终为true
。
您应该为D
指定正确的列索引,即4
。 它应该是这样的:
var currentCell = sheet.getRange(startRow + i, 4);
编辑:此外,带有选中复选框的单元格的检索值是 boolean true
,并且您正在尝试将它与字符串TRUE
进行比较。 因此,这种情况无法正常工作。 请更换:
var complete = "TRUE";
到
var complete = true;
您想要获取工作表中第100
行到最后一行的值。 在这种情况下,范围内的总行数应为最后一行 ( numRows
) 减去范围内的第一行 ( startRow
) 再加上一 ( numRows - startRow + 1
)。 dataRange
应该这样定义:
var dataRange = sheet.getRange(startRow, 1, numRows - startRow + 1, numColumns);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.