繁体   English   中英

使用 Google 表格脚本创建 Google 日历事件有错误

[英]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) {

空字符串:== 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM