Google apps script 如果已经存在同名文件(谷歌应用程序脚本+;谷歌工作表),则不保存PDF
今天,脚本中定义如何将PDF保存到Google Drive中的共享文件夹的部分如下所示:Google apps script 如果已经存在同名文件(谷歌应用程序脚本+;谷歌工作表),则不保存PDF,google-apps-script,google-sheets,Google Apps Script,Google Sheets,今天,脚本中定义如何将PDF保存到Google Drive中的共享文件夹的部分如下所示: var token = ScriptApp.getOAuthToken(); var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' + token } }); var pdfBlob = docurl.getBlob(); //...get token and Blob
var token = ScriptApp.getOAuthToken();
var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' + token } });
var pdfBlob = docurl.getBlob();
//...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();
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;
}
}
//add file;
folder.createFile(pdfBlob).setName(fileName);
当我与其他人共享文件夹时,我只能编辑我拥有的文件
我想在以下问题上得到一些帮助
1-分析是否有我试图保存的文件名,如果我拥有该文件,则尝试删除该文件以保存新文件。(已存在于脚本中)
2-如果文件来自其他人,他将无法在上述步骤中删除该文件。(已存在于脚本中)
3-如果无法删除,他将放弃保存文件,因为这样,文件夹中就不会有重复的文件,且数据相同。(脚本中尚不存在)→ (我的需要)
问题:在当前格式中,它尝试删除现有文件以创建新文件,无论是否能够删除,他都会保存新文件,有时会导致同一文件夹中两个不同的人创建两个文件。这不可能发生。
如果无法保存,我需要它不要给出错误消息,因为如果它不保存文件,它下面还有更多行需要一直运行到脚本结束,因为已经有一行同名。
我尝试使用IF方法,但它导致一个错误,使脚本停止,我尝试使用的基础是:
var existing = folder.getFilesByName(fileName); //returns iterator;
if(existing.hasNext()) {
var duplicate = existing.next();
if(dres.getResponseCode()>=400) {
//handle errors;
- 仅当文件可以删除时,才创建新文件
- 即使无法删除文件,也不希望停止脚本
- 在您的脚本中,我认为需要修改
的if语句if(existing.hasNext()){}
用于请求。因此,即使状态代码不是200,脚本也不会停止muteHttpExceptions:true
- 如果您只想在可以删除文件的情况下创建新文件,那么添加
如何if(status==200)
if(existing.hasNext()){}
的if语句
if(existing.hasNext()) {
var duplicate = existing.next();
var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId();
var dres = UrlFetchApp.fetch(durl,{
method: 'delete',
muteHttpExceptions: true,
headers: {'Authorization': 'Bearer '+token}
});
var status = dres.getResponseCode(); // Added
if (status >=400) { // Modified
//handle errors;
} else if (status == 200) {
folder.createFile(pdfBlob).setName(fileName); // Added
}
} else {
folder.createFile(pdfBlob).setName(fileName); // Added
}
- 在此修改中,请删除文件夹.createFile(pdfBlob).setName(文件名)代码>在问题脚本的最后一行
- 与其他模式一样,首先,如果检查了文件的所有者,那么下面修改的脚本如何
if(existing.hasNext()) { var duplicate = existing.next(); if (duplicate.getOwner().getEmail() == Session.getActiveUser().getEmail()) { // Added var durl = 'https://www.googleapis.com/drive/v3/files/'+duplicate.getId(); var dres = UrlFetchApp.fetch(durl,{ method: 'delete', muteHttpExceptions: true, headers: {'Authorization': 'Bearer '+token} }); var status = dres.getResponseCode(); // Added if (status >=400) { // Modified //handle errors; } else if (status == 200) { folder.createFile(pdfBlob).setName(fileName); // Added } } } else { folder.createFile(pdfBlob).setName(fileName); // Added }
如果我误解了你的问题,而这不是你想要的方向,我道歉。@Frederico Mattos谢谢你的回答。虽然这两种模式都可以工作,但在开始检查文件所有者时,可以降低处理成本,因为当文件所有者不是您时,
UrlFetchApp.fetch()
不会运行。所以我认为你的回答是肯定的。你的回答总是非常认真,字迹准确。再次感谢你@Frederico Mattos感谢您的回复。我更新了我的答案。你能确认一下吗?如果那不是你想要的结果,请告诉我。在这种情况下,您还可以将folder.createFile(pdfBlob).setName(fileName)
声明为函数。已确认脚本执行。一切都很顺利。谢谢你,伙计@Frederico Mattosif(status=200)
与将200
替换为status
相同。语句的脚本始终处于运行状态。在本例中,如果(状态>=400){//handle errors;}folder.createFile(pdfBlob).setName(文件名),也可以修改为代码>。