Javascript 谷歌硬盘&x2B;即使通过I';我拥有并被授予许可
我试图在一个12小时计时器触发器上创建一个基本脚本,通过ICAL URL循环遍历我的每个Google日历,并为我的Google驱动器上的一个文件夹下载ICAL(用于备份)。它抛出了这个错误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... ) 运行脚本确实会在循环的第
"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;i var 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;”就可以了。