0

我创建了一个电子表格,可以从 Google 电子表格名册创建 Google 日历事件。

在过去的一个月里,我在我的团队中成功地使用了它,现在我遇到了所有可怕的 Date 类型的问题。

据我了解,在使用 .getValue() 等函数时,将全面使用电子表格时区来确定日期。现在,当我尝试发送 11 月花名册的日历事件时,它工作正常,直到从 2012 年 11 月 12 日更改为 2012 年 11 月 13 日。

该脚本将正确获取日期 2012 年 12 月 11 日(变量类型:日期),并将使用它来创建事件。当它试图获取下一个日期时,它只会返回一个空白字符串。然后,Utilities.formatDate() 函数会抛出一个错误,指出它无法格式化字符串变量。

下图显示了 11 月 10 日的代码和调试信息。如果它工作正常,这也是第 13 号的外观。 在此处输入图像描述

下图显示了 11 月 13 日的代码、​​错误和调试信息。您可以看到 getDate 是一个空白字符串,而 10th 是一个日期。(getDate 变量之后的任何变量信息都是上次迭代遗留下来的) 在此处输入图像描述

我一直在绞尽脑汁来解释这一点。.getValue() 引用的两个单元格都包含有效的澳大利亚日期。它在整个 10 月都有效,只有当日期晚于 2012 年 11 月 13 日时才会出现问题(我也使用 2012 年 11 月 17 日进行了测试,结果相同)。

这就是我的想法:.getValue 返回 13/11/2012,但随后脚本将此视为美国日期。因此它决定没有第 13 个月并回退到一个空字符串。这种解释没有说明在 10 月事件中的正确使用。该脚本处理 13/10/2012 就好了。

如果您有任何建议,请提出,我无能为力!

编辑:根据要求添加代码:

function sendInvites() {
  // Gather Prelim Information
  var splash = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Splash");
  var nameRange = splash.getRange("A6:B26"); // Need to change this to be the full staff list in Splash

 // var inviteSheet = Browser.inputBox("Sheet to send invites from (Number)", Browser.Buttons.OK_CANCEL)
  var days = SpreadsheetApp.getActiveSpreadsheet().getSheets()[2];
  var dayRange;

  //Initiate iteration through Names, according to the Splash sheet
  for(nameRow=nameRange.getRow(); nameRow<=26; nameRow++){ //Change to Corresponding iterate
    // Gather Name and Email information for the each person
    var col = nameRange.getColumn();
    var row = nameRow;
    var name = splash.getRange(row, col).getValue();
    var email = splash.getRange(row, col+1).getValue();
    var eventChoice = splash.getRange(row, col+2).getValue();

    //Proceed if all information and permission exists
    if(name != "" && email != "" && eventChoice == "Yes"){
      var cal = CalendarApp.getCalendarById(email);

      //Initiate iteration through Days, according to the Roster
      for(i=0; i<=6; i++){
        //Specify Day Ranges
        switch(i){
          case 0: //Saturday
            dayRange = days.getRange("A1:O6"); break;
          case 1: //Sunday
            dayRange = days.getRange("A10:O15"); break;
          case 2: //Monday
            dayRange = days.getRange("A19:O41"); break;
          case 3: //Tuesday
            dayRange = days.getRange("A45:O67"); break;
          case 4: //Wednesday
            dayRange = days.getRange("A71:O93"); break;
          case 5: //Thursday
            dayRange = days.getRange("A97:O119"); break;
          case 6: //Friday
            dayRange = days.getRange("A123:O145"); break;
        }

        //Find Name in dayRange
        for(dayRow=dayRange.getRow(); dayRow<=dayRange.getLastRow(); dayRow++){
          var searchCol = dayRange.getColumn();
          var searchRow = dayRow;        
          var searchName = days.getRange(searchRow, searchCol).getValue();

          if (name==searchName){
            // Gather and format Date and Time information for invitation
            var eventName = "Library & IT Help";
            var getDate = dayRange.getValue();

            var date = Utilities.formatDate(getDate, "GMT+1000", "EEE MMM dd yyyy");
            var startCell = days.getRange(searchRow, searchCol+1).getValue();
            var endCell = days.getRange(searchRow, searchCol+2).getValue();

            if (startCell != ""){
              var startTime = date + " " + Utilities.formatDate(startCell, "GMT+1000", "HH:mm:ss");
              var endTime = date + " " + Utilities.formatDate(endCell, "GMT+1000", "HH:mm:ss");
              //Create a calendar event with the details above
              cal.createEvent(eventName, new Date(startTime), new Date(endTime));
            }
          }
        }
      }
    }
  }
}
4

1 回答 1

1

您需要确保脚本本身使用您正在使用的语言环境。您可以在脚本编辑器 > 文件 > 属性(从内存中)中进行设置。

于 2012-11-01T05:22:12.730 回答