Google云端硬盘+脚本即使通过我所有者和授予的权限也会引发权限错误

时间:2018-02-22 20:16:44

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

我尝试在12小时定时器触发器上创建一个基本脚本,该触发器通过其ICAL URL遍历我的每个Google日历,并下载ICAL作为我的Google云端硬盘上的文件夹(用于备份目的) 。它会抛出此错误

"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

}

2 个答案:

答案 0 :(得分:2)

已更新:您还要从参数中重新初始化已存在的变量 全局变量,以便我们删除如果要保留全局变量,请参数。

我们还可以移动您获取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

}

让我们看看它在哪里。

答案 1 :(得分:-1)

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

Google应用编码似乎要求变量位于要定义的函数中。我建议将“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);
}