Google 驱动器 + 脚本抛出权限错误,即使我是所有者并已授予权限
Google Drive + Script throws permissions error even through I'm owner and granted permission
我正在尝试在 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
}
更新:你也是re-initializing一个变量已经存在从参数和全局变量所以如果你想保留全局变量,我们可以删除参数。
我们还可以移动您获取 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
}
让我们看看它能给我们带来什么。
您的 "folder" 变量在函数之外,导致 "downloadFile" 函数无法访问数据。
Google 应用程序编码似乎要求变量在要定义的函数中。我建议将 "calendarsToSave" 和 "folder" 都移到 "downloadFile"
的内部
这是一个示例,可以 return 您的错误:
var folder = '1HSFBPfPIsXWvFEb_AalFYalkPwrOAyxD';
function myFunction() {
var folder = DriveApp.getFolderById(folder);
var name = folder.getName();
Logger.log(name);
}
这里是 return 文件名:
function myFunction() {
var folder = '1HSFBPfPIsXWvFEb_AalFYalkPwrOAyxD';
var folder = DriveApp.getFolderById(folder);
var name = folder.getName();
Logger.log(name);
}
我正在尝试在 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
}
更新:你也是re-initializing一个变量已经存在从参数和全局变量所以如果你想保留全局变量,我们可以删除参数。
我们还可以移动您获取 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
}
让我们看看它能给我们带来什么。
您的 "folder" 变量在函数之外,导致 "downloadFile" 函数无法访问数据。
Google 应用程序编码似乎要求变量在要定义的函数中。我建议将 "calendarsToSave" 和 "folder" 都移到 "downloadFile"
的内部这是一个示例,可以 return 您的错误:
var folder = '1HSFBPfPIsXWvFEb_AalFYalkPwrOAyxD';
function myFunction() {
var folder = DriveApp.getFolderById(folder);
var name = folder.getName();
Logger.log(name);
}
这里是 return 文件名:
function myFunction() {
var folder = '1HSFBPfPIsXWvFEb_AalFYalkPwrOAyxD';
var folder = DriveApp.getFolderById(folder);
var name = folder.getName();
Logger.log(name);
}