我需要使用 GS 下载图像并将其保存在特定的驱动器文件夹中。
我可以将图像保存在根文件夹中,但无法将其保存在特定文件夹中:
function downloadFile(fileURL,folder) {
var fileName = "";
var fileSize = 0;
var response = UrlFetchApp.fetch(fileURL, {muteHttpExceptions: true});
var rc = response.getResponseCode();
if (rc == 200) {
var fileBlob = response.getBlob()
var folder = DriveApp.getFoldersByName(folder);
if (folder != null) {
var file = DriveApp.createFile(fileBlob);
fileName = file.getName();
fileSize = file.getSize();
}
}
var fileInfo = { "rc":rc, "fileName":fileName, "fileSize":fileSize };
return fileInfo;
}
问题:我需要添加什么才能使用变量“文件夹”?
我发现很多“DocList”类的例子已经不再使用了
嗯,我猜 GAS 在开发其 API、函数方面已经取得了很大进展 对象文件夹的
createFile(blob)
将完成这项工作:
https://developers.google.com/apps-script/reference/drive/folder#createfileblob
// Create an image file in Google Drive using the Maps service.
var blob = Maps.newStaticMap().setCenter('76 9th Avenue, New York NY').getBlob();
DriveApp.getRootFolder().createFile(blob);
现在回答已经很晚了,但以防万一有人遇到这种情况。
您熟悉这个应用程序吗?它完全符合您的要求。
但是,如果您想出于自己的目的重新创建它,我会更改您的变量声明
file
,如下所示:
var file = folder.next().createFile(fileBlob);
当您创建变量
folder
时,您使用的方法会创建一个 FolderIterator
,而不是单个文件夹。您必须调用 next()
方法才能获取 Folder
对象。
为了准确地使用您的脚本并避免保存到名称不正确但名称相似的文件夹,我建议将文件夹 ID 传递给您的脚本而不是文件夹名称。如果您传递文件夹 ID,则可以将
folder
声明为:
var folder = DriveApp.getFolderById(folder);
然后继续编写您编写的脚本。我希望这有帮助。
在处理类似的问题时,我想出了以下解决方案将文件保存到文件夹中。如果该文件夹不存在,则会创建该文件夹,否则会保存“FOLDER_NAME”指定的文件
var folderExists = checkFolderExists("FOLDER_NAME");
if (folderExists) {
saveFolder = DriveApp.getFolderById(folderExists);
} else {
saveFolder = DriveApp.createFolder("FOLDER_NAME");
}
// Make a copy of the file in the root drive.
var file = DriveApp.getFileById(sheetID);
// Take the copy of the file created above and move it into the folder:
var newFile = DriveApp.getFolderById(saveFolder.getId()).addFile(file);
// Remove the copy of the file in the root drive.
var docfile = file.getParents().next().removeFile(file);
除了 Eric 的回答之外,我还提供了一个实用程序函数来检查该文件夹是否存在。它可以在任何项目中重复使用。
function checkFolderExists(fName) {
try {
var folderId;
var folders = DriveApp.getFolders();
while (folders.hasNext()) {
var folder = folders.next();
folderName = folder.getName();
if (folderName == fName) {
folderId = folder.getId();
}
}
} catch(e) {
log("Services::checkFolderExists()" + e.toString());
throw e;
}
return folderId;
}