Google apps script 按名称覆盖文件夹中的现有文件(第2部分)
以这种方式测试脚本时,如果Google apps script 按名称覆盖文件夹中的现有文件(第2部分),google-apps-script,Google Apps Script,以这种方式测试脚本时,如果SQUADS文件夹中没有具有我要保存的名称的文件,它实际上会保存在SQUADS文件夹中 但是,当有一个名为我想要的文件时,它会将新的PDF保存在Google Drive主文件夹中,正确的做法是删除SQUADS文件夹中的现有文件,并保存在SQUADS文件夹中 有些东西不见了,我仍然不明白如何解决 var token = ScriptApp.getOAuthToken(); var docurl = UrlFetchApp.fetch(theurl, { h
SQUADS
文件夹中没有具有我要保存的名称的文件,它实际上会保存在SQUADS文件夹中
但是,当有一个名为我想要的文件时,它会将新的PDF保存在Google Drive主文件夹中,正确的做法是删除SQUADS
文件夹中的现有文件,并保存在SQUADS
文件夹中
有些东西不见了,我仍然不明白如何解决
var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' + token } });
var pdfBlob = docurl.getBlob();
// Get filename from sheet "Work", cell "B5"
var fileName = spreadsheet.getSheetByName("Gerais").getRange("H2").getValue();
// Create file from blob and name it
// The newFile is placed in the root folder by default
var newFile = DriveApp.createFile(pdfBlob).setName(fileName);
// if folder exists use next
if (DriveApp.getFoldersByName("Squads").hasNext()){
var folder = DriveApp.getFoldersByName("Squads").next();
// if folder does not exist
} else {
var folder = DriveApp.createFolder("Squads");// new folder created in the root folder by default
}
//prepare new file and Squads folder;
var existing = folder.getFilesByName(fileName); //returns file iterator;
var hasFile = existing.hasNext(); //check if iterator isn't empty;
if(hasFile) {
var duplicate = existing.next(); //access file;
//delete file;
var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId();
var dres = UrlFetchApp.fetch(durl,'delete',{
muteHttpExceptions: true,
headers: {'Authorization': 'Bearer '+token}
});
if(dres.getResponseCode()>=400) {
//handle errors;
}
}
//continue: add file, remove from root, etc;
folder.addFile(newFile); // add new file to folder
DriveApp.removeFile(newFile); // remove file from root folder
在资源方面似乎已经授权→ 谷歌高级服务→ 驱动API V2问题 删除重复文件并在目标文件夹中创建新文件 解决方案 要展开第1部分和注释,可以在目标文件夹上使用
createFile()
方法,以确保新文件直接在其中创建,而不是在驱动器的根目录中创建。脚本的修改结果应如下所示:
此示例假定您在激活高级服务时将其命名为“驱动API”。还要注意的是,文件夹
声明被移动到函数作用域以正常工作(如果要在较宽的范围内使用变量,请不要在较小的范围内声明变量[在if…else
语句中]):
高级驱动器服务解决方案
驱动API解决方案
参考
createFile()
来自Blob[文件夹
class]李>
驱动器
高级服务李>
文件
资源[驱动公共API]李>
Frederico,您可以在
hasFile
检查后,使用文件夹本身的方法直接在文件夹中创建文件(您必须将Blob
转换为字符串,因为该方法接受内容字符串),小提示上次我忘了-不要重新定义变量,例如文件夹
:将其声明移动到函数级别,有条件地设置它,然后进行hasFile
检查,然后创建文件另一个提示是,如果您使用的是高级服务,则不需要调用公共API,访问duplicate
文件后,您可以通过{service name what you set}.Files.remove(duplicate.getId())
调用它。虽然我不确定这是否是您想要的方向,但如果您想在不更改文件ID的情况下替换PDF文件,您也可以使用的方法。谢谢您的回复。我可以理解您想要更改文件ID以替换文件。在这种情况下,需要完全删除现有文件并创建新文件。顺便说一下,我认为var dres=UrlFetchApp.fetch(durl,'delete',{muteHttpExceptions:true,headers:{'Authorization':'Bearer'+token}})的脚本可能会出错代码>。这个怎么样?@Frederico Mattos,@Tanaike-my bad,yes(正如我对第1部分的回答中的fetch部分),它应该是:`UrlFetchApp.fetch(durl,{method:'delete',headers:{'Authorization':'Bearer'+token},muteHttpExceptions:true});非常感谢您的耐心和花时间来澄清我的剩余问题。系统非常完美,甚至比以前更快,非常感谢@弗雷德里克马托斯-没问题,很乐意帮忙!干得好@OlegValter!您也可以查看谷歌批处理API以获得更高的效率。@contributorpw-谢谢!同意,稍后将进一步扩展(批处理操作不在操作的问题范围内,但既然我们在这里:)
//...get token and Blob (do not create the file);
var fileName = spreadsheet.getSheetByName("Gerais").getRange("H2").getValue();
//Access or create the 'Squads' folder;
var folder; //declare folder;
var folders = DriveApp.getFoldersByName("Squads"); //returns iterator;
if(folders.hasNext()) {
folder = folders.next();
}else {
folder = DriveApp.createFolder("Squads");
}
//Remove duplicate file with the same name;
var existing = folder.getFilesByName(fileName); //returns iterator;
if(existing.hasNext()) {
var duplicate = existing.next();
//use either Drive API or Advanced service solution here;
}
//add file;
folder.createFile(pdfBlob).setName(fileName);
DriveAPI.Files.remove(duplicate.getId());
var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId();
var dres = UrlFetchApp.fetch(durl,{
method: 'delete',
muteHttpExceptions: true,
headers: {'Authorization': 'Bearer '+token}
});
if(dres.getResponseCode()>=400) {
//handle errors;
}