【问题标题】:Can I set a variable to be an "Id" for a .getCalendarById in google script?我可以在谷歌脚本中将变量设置为 .getCalendarById 的“Id”吗?
【发布时间】:2019-12-30 05:57:33
【问题描述】:

所以我想要一个谷歌电子表格从带有两个标签的日历中获取数据。一个选项卡将是输入数据的地方; “咝咝”。第二个选项卡将是一个设置选项卡,您可以在其中选择 DateFrom、DateTo 和 CurrentEmail; “ss设置”。当用户输入往返日期时,他们还可以查看脚本当前从哪个电子邮件获取信息,并且可以根据需要进行更改。我为“datefrom”和“dateto”设置了变量,但是当我尝试对“currentEmail”执行相同操作时,出现以下错误;

TypeError: Cannot call method "getEvents" of null. (line 8, file "Code")

有人知道如何解决这个问题吗?我对谷歌脚本相当陌生。这是我的脚本;

    function getEvents() {
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("GettingEvents")
      var ssSettings = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("GettingEventsSettings");
      var DateFrom = ssSettings.getRange("B1").getValue();
      var DateTo = ssSettings.getRange("B2").getValue();
      var CurrentEmail = ssSettings.getRange("B3").getValue();
      var cal = CalendarApp.getCalendarById(CurrentEmail);
      var events = cal.getEvents(DateFrom, DateTo);
      var lr = ss.getLastRow();
      ss.getRange(2, 1, lr, 5).clearContent();
      for(var i = 0;i<events.length;i++){
         var title = events[i].getTitle();
         var sd = events[i].getStartTime();
         var ed = events[i].getEndTime();
         var loc = events[i].getLocation();
         var des = events[i].getDescription();

         ss.getRange(i+2,1).setValue(title);
         ss.getRange(i+2,2).setValue(sd);
         ss.getRange(i+2,3).setValue(ed);
         ss.getRange(i+2,4).setValue(loc);
         ss.getRange(i+2,5).setValue(des);
      }
    }

我希望设置选项卡看起来像这样,或者用户可以在不修改代码的情况下进行编辑。

【问题讨论】:

标签: google-apps-script google-sheets google-calendar-api


【解决方案1】:

您获得TypeError: Cannot call method "getEvents" of null. (line 8, file "Code") 的原因是您使用的脚本绑定到活动电子表格。 .getActive() 方法返回当前活动的电子表格,如果没有,则返回 null,这在您的情况下发生在上面提供的代码中。

为了能够与电子表格进行交互,您必须将代码更新为:

var as = SpreadsheetApp.openById("YOUR_SPREADSHEET_ID");
var ss = as.getSheetByName("GettingEvents")
var ssSettings = as.getSheetByName("GettingEventsSettings");

.openById() 方法打开具有指定 ID 的电子表格,因此您可以按名称获取表格。

此外,我建议您查看这些链接,因为它们可能对您未来的发展有所帮助:

  1. Class SpreadsheetApp - openById();

  2. Class SpreadsheetApp - getActive().

【讨论】:

  • 感谢您的建议,但我收到了同样的错误; Cannot call method "getEvents" of null. 我的直觉是我没有正确创建我的“CurrentEmail”变量,它必须不仅仅需要ssSettings.getRange("B3").getValue();
  • 您好@Mauricio,感谢您的回复。 email 变量看起来如何?因为我尝试了您的代码并且没有问题,所以您可能想查看一下。干杯!
  • 我输入正确了吗? function getEvents() { var as = SpreadsheetApp.openById("ID"); var ss = as.getSheetByName("GettingEvents") var ssSettings = as.getSheetByName("GettingEventsSettings"); var DateFrom = ssSettings.getRange("B1").getValue(); var DateTo = ssSettings.getRange("B2").getValue(); var CurrentEmail = ssSettings.getRange("B3").getValue(); var cal = CalendarApp.getCalendarById(CurrentEmail); var events = cal.getEvents(DateFrom, DateTo);.....
  • 问题不在代码中,因为它工作正常。您可能需要在GettingEventsSettings 表中检查电子邮件地址的声明方式。邮箱地址是否存在,是否有calendars与之关联?
  • 完美运行!我猜我使用的电子邮件需要来自不同帐户的权限。谢谢!
【解决方案2】:

您可以使用类似的方法获取所有日历的信息:

function calinfo() {
  var cals=CalendarApp.getAllCalendars();
  var calObj={nameA:[]};
  cals.forEach(function(cal,i){calObj[cal.getName()]=cal.getId();calObj.nameA.push(cal.getName());});
  Logger.log(JSON.stringify(calObj));
}               

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2021-09-21
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多