Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌硬盘&x2B;即使通过I';我拥有并被授予许可_Javascript_Google Apps Script_Google Calendar Api - Fatal编程技术网

Javascript 谷歌硬盘&x2B;即使通过I';我拥有并被授予许可

Javascript 谷歌硬盘&x2B;即使通过I';我拥有并被授予许可,javascript,google-apps-script,google-calendar-api,Javascript,Google Apps Script,Google Calendar Api,我试图在一个12小时计时器触发器上创建一个基本脚本,通过ICAL URL循环遍历我的每个Google日历,并为我的Google驱动器上的一个文件夹下载ICAL(用于备份)。它抛出了这个错误 "No item with the given ID could be found, or you do not have permission to access it. (line 23, file "Code")" (Line #23 is var folder... ) 运行脚本确实会在循环的第

我试图在一个12小时计时器触发器上创建一个基本脚本,通过ICAL URL循环遍历我的每个Google日历,并为我的Google驱动器上的一个文件夹下载ICAL(用于备份)。它抛出了这个错误

"No item with the given ID could be found, or you do not have permission to access it. (line 23, file "Code")"   (Line #23 is var folder... )
运行脚本确实会在循环的第一次运行时下载并保存ICAL文件(如果我手动一次传递一个唯一的ICAL URL),但是错误会终止循环。鉴于我已经授权访问并且是这里所有东西的所有者,我不确定我还需要什么

var calendarsToSave = [
                     "https://calendar.google.com/calendar/ical/inXXXXXXX.com/privateXXXX/basic.ics",
                     "https://calendar.google.com/calendar/ical/XXXXX.com_XXXXXXup.calendar.google.com/private-XXXXXXX/basic.ics"
                    ]; 

var folder = '123xxxxxxxxv789';  // my gdrive folder 


function downloadFile(calendarURL,folder) {

   var fileName = "";
   var fileSize = 0;

  for (var i = 0; i < calendarsToSave.length; i++) { 

    var calendarURL = calendarsToSave[i];

    var response = UrlFetchApp.fetch(calendarURL, {muteHttpExceptions: true});
    var rc = response.getResponseCode();

    if (rc == 200) {
      var fileBlob = response.getBlob()

      var folder = DriveApp.getFolderById(folder);   // << returns a permissions error thus terminating the for loop
      var file = folder.createFile(fileBlob);
      fileName = file.getName();
      fileSize = file.getSize();

    }

    var fileInfo = { "rc":rc, "fileName":fileName, "fileSize":fileSize };
    return fileInfo;    

  }  // end for loop

}
var calendarsToSave=[
"https://calendar.google.com/calendar/ical/inXXXXXXX.com/privateXXXX/basic.ics",
"https://calendar.google.com/calendar/ical/XXXXX.com_XXXXXXup.calendar.google.com/private-XXXXXXX/basic.ics"
]; 
var文件夹='123xxxxxxxv789';//我的gdrive文件夹
函数下载文件(日历URL、文件夹){
var fileName=“”;
var fileSize=0;
对于(var i=0;ivar folder=DriveApp.getFolderById(folder);//已更新:您还将重新初始化参数中已存在的变量,并将其作为全局变量,因此如果您希望保留全局变量,我们可以删除该参数

我们还可以移动您获取Google文件夹对象的位置。它每次都保持不变,因此我们不需要再次检索它

var calendarsToSave = [
                     "https://calendar.google.com/calendar/ical/inXXXXXXX.com/privateXXXX/basic.ics",
                     "https://calendar.google.com/calendar/ical/XXXXX.com_XXXXXXup.calendar.google.com/private-XXXXXXX/basic.ics"
                    ]; 

var folder = '123xxxxxxxxv789';  // my gdrive folder 


function downloadFile(calendarURL) {

   var fileName = "";
   var fileSize = 0;
   var gfolder = DriveApp.getFolderById(folder);

  for (var i = 0; i < calendarsToSave.length; i++) { 

    var calendarURL = calendarsToSave[i];

    var response = UrlFetchApp.fetch(calendarURL, {muteHttpExceptions: true});
    var rc = response.getResponseCode();

    if (rc == 200) {
      var fileBlob = response.getBlob()

      var file = gfolder.createFile(fileBlob);
      fileName = file.getName();
      fileSize = file.getSize();

    }

    var fileInfo = { "rc":rc, "fileName":fileName, "fileSize":fileSize };
    return fileInfo;    

  }  // end for loop

}
var calendarsToSave=[
"https://calendar.google.com/calendar/ical/inXXXXXXX.com/privateXXXX/basic.ics",
"https://calendar.google.com/calendar/ical/XXXXX.com_XXXXXXup.calendar.google.com/private-XXXXXXX/basic.ics"
]; 
var folder='123xxxxxxxv789';//我的gdrive文件夹
函数下载文件(calendarURL){
var fileName=“”;
var fileSize=0;
var gfolder=DriveApp.getFolderById(文件夹);
对于(var i=0;i
让我们看看这是怎么回事。

您的“folder”变量在函数外部,导致“downloadFile”函数无法访问数据

谷歌应用程序编码似乎需要在函数中定义变量。我建议将“calendarsToSave”和“folder”移到“downloadFile”的内部

下面是一个将返回错误的示例:

 var folder = '1HSFBPfPIsXWvFEb_AalFYalkPwrOAyxD';
 function myFunction() {
       var folder = DriveApp.getFolderById(folder);
       var name = folder.getName();
       Logger.log(name);
 }
下面是一个将返回文件名的文件:

function myFunction() {
   var folder = '1HSFBPfPIsXWvFEb_AalFYalkPwrOAyxD';
   var folder = DriveApp.getFolderById(folder);

   var name = folder.getName();
   Logger.log(name);
}

只是想让你知道这叫做“范围”这在sane编程语言中相当常见。变量可以位于函数之外。在Google Apps Script中,它是应用程序的全局变量。这不是最好的方法,但对于小型个人脚本来说也可以。不好的是在函数中重新初始化它,创建一个新的较小范围并使其混乱。您可以是脚本主体中的常量,在函数之外,并且可以在项目范围内访问。例如,定义一个电子表格id以供多个方法访问,或者为OP定义一个文件夹id。这消除了错误,谢谢。现在我想我需要在其中添加另一个For循环,因为它只生成一个ics文件,而不是每个都生成一个calendarsToSave数组中的URL。编辑:我只需要删除“ReturnFileInfo;”就可以了。