【问题标题】:Google Sheets - Script to “Replace” instead of “Create”, when file name is the same谷歌表格 - 当文件名相同时,脚本“替换”而不是“创建”
【发布时间】:2019-01-19 03:53:49
【问题描述】:

编辑尝试使这更容易理解:

这是我所做的:

我创建了一个 Google 电子表格。我创建了一个 SCRIPT,它使用基于服务日期和客户名称的文件名将其保存到 Google Drive 文件夹中。

这是我目前拥有的脚本:

// This creates a custom Menu Function so that I can save the file. 

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Choice Menu')
  .addItem('Submit Form','saveAsSpreadsheet')
       .addToUi();  }      

// Saves Spreadsheet in Google Drive Folder

function saveAsSpreadsheet() {
 var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var destFolder = DriveApp.getFolderById("0B8xnkPYxGFbUMktOWm14TVA3Yjg");
  DriveApp.getFileById(sheet.getId()).makeCopy(getFilename(), destFolder);
   } 

//This Function uses a cell "G4" (Which is Date and Customer Name) to create a file name. This file name will be then used for the above Script.

function getFilename() {

    var spreadsheet = SpreadsheetApp.getActive();

    var sheet = spreadsheet.getSheetByName('Manifest');
       var cell = sheet.getRange('G4');
    var filename = cell.getValue();

    return filename;}

所以我的代码运行良好,除了一个问题。

这是我的问题:

当我使用上述脚本第二次保存电子表格时,它会保存一个新文件。除非文件名相同,否则我想将其另存为新文件。如果文件名相同,我想删除原文件,然后保存新文件。

我尝试了什么: 根据我对以下 cmets 的理解,我需要运行一个代码,“1. 需要运行查询以查看是否存在任何具有您选择的名称的文件,然后采取相应的行动。2. 如果没有具有该名称的文件名称,然后继续创建一个(使用我上面列出的函数)。如果有同名文件,3.删除原始文件并创建一个新的同名文件。

我尝试了几天来尝试不同的选项,但都没有奏效,所以我希望重新开始。

欣赏任何编码解决方案或前进方向!

【问题讨论】:

  • 我可以问你关于it replace (not create a copy) 的事吗?如果文件夹中有一个文件名重复的文件,你想怎么办? 1.您要删除现有文件并创建具有相同文件名的新文件。在这种情况下,文件 ID 与原始文件不同。 2. 您想替换文件而不更改文件 ID。在现阶段,这还不能实现。
  • 如果电子表格足够简单,您可以将工作表从新文件复制到旧文件并删除旧工作表。如果您引用其他工作表上的命名范围,或者如果您有引用其他工作表或更复杂的公式(至少在没有重要编码的情况下),这将不起作用。
  • @s1c0j1 ,看起来我的工作表很复杂。该文件由多张纸组成。
  • @Tanaike ,我想做你的选择 1。我不在乎 fileID 不同。
  • @Ben 感谢您的回复。我注意到发布了一个答案。我认为它会解决您的问题。

标签: google-apps-script google-sheets google-drive-api


【解决方案1】:
  • 您的脚本是电子表格的容器绑定脚本。
  • 当具有搜索文件名的电子表格存在于特定文件夹中时,您希望将其替换为活动电子表格。
    • 在当前阶段,文件 ID 不变的情况下无法替换文件。所以在这个修改后的脚本中,活动的电子表格被复制,搜索的文件被删除。
  • 当搜索到的文件不存在于特定文件夹中时,您希望将活动电子表格复制到该文件夹​​中。
  • 您想使用从getFilename() 返回的值作为文件名。

如果我的理解是正确的,那么这个修改呢?我认为您的情况有几种解决方案。所以请认为这只是其中之一。

修改脚本:

请修改saveAsSpreadsheet()如下。

function saveAsSpreadsheet() {
  var folderId = "0B8xnkPYxGFbUMktOWm14TVA3Yjg";
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFilesByName(getFilename());
  if (files.hasNext()) {
    files.next().setTrashed(true);
  }
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  DriveApp.getFileById(sheet.getId()).makeCopy(getFilename(), folder);
}

注意:

  • 为了搜索文件,我使用了getFilesByName(),因为我认为文件名似乎是不变的。
  • setTrashed() 用于删除文件用于此脚本。在这种情况下,文件被放入垃圾箱。如果要直接删除文件,可以使用Drive API实现。到时候请告诉我。

参考资料:

编辑:

如果要直接删除文件,请修改脚本如下。

发件人:

files.next().setTrashed(true);

收件人:

var params = {method: "delete", headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}};
UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + files.next().getId(), params);
  • 我使用 UrlFetchApp 的方法是因为我认为在您的情况下,Drive API 已经启用。在这种情况下,您只需替换脚本即可使用 Drive API 的删除方法。

参考:

【讨论】:

  • @Ben 感谢您的回复。我添加了直接删除文件的方法。你能确认一下吗?
【解决方案2】:

你需要退后一步,改变你对文件名的看法。

在 GDrive 中,文件由其唯一 ID 标识。 name 只是一个与 timeModified、owner、mimeType 等并列的元数据属性。因此,拥有多个具有相同名称的文件与拥有多个具有相同 mimeType 的文件一样自然。

您的代码将需要运行查询以查看是否存在任何具有您选择的名称的文件,然后采取相应措施。如果没有具有该名称的文件,则继续创建一个。如果有,那么您可以选择更新现有文件,或删除原始文件并创建一个具有相同名称的新文件。

【讨论】:

  • 这是在正确的轨道上!我会试着看看我是否能弄清楚如何运行查询和删除文件。它可能比我的编码能力更复杂。
  • DriveApp 的所有方法都在这里developers.google.com/apps-script/reference/drive/drive-app。你想要searchFilesremoveFile
  • 或 getFilesByName() 而不是 searchFiles()。如果您只关心名称,可能会更容易一些。
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多