【问题标题】:How can I modify this to save a spreadsheet into a new folder如何修改它以将电子表格保存到新文件夹中
【发布时间】:2020-10-10 15:43:42
【问题描述】:

我找到了保存电子表格副本的脚本,但到目前为止,我无法弄清楚如何修改以下代码以将我的电子表格保存到新创建的/已经存在的文件夹中。

//Create folder if it does not exist
function createFolder(folderID, folderName){
  var parentFolder = DriveApp.getFolderById(folderID);
  var subFolders = parentFolder.getFolders();
  var doesntExist = true;
  var newFolder = '';
  
  // Check if folder already exists.
  while(subFolders.hasNext()){
    var folder = subFolders.next();
    
    //If the folder exists return the id of the folder
    if(folder.getName() === folderName){
      doesntExist = false;
      newFolder = folder;
      return newFolder.getId();
    };
  };
  //If the folder doesn't exist, then create a new folder
  if(doesntExist == true){
    //If the file doesn't exist
    newFolder = parentFolder.createFolder(folderName);
    return newFolder.getId();
  };
};
 
function start(){
  var FOLDER_ID = 'my folder id';
  var NEW_FOLDER_NAME = SpreadsheetApp.getActiveSheet().getRange('A1').getValue();
  var myFolderID = createFolder(FOLDER_ID, NEW_FOLDER_NAME);
};

更新:

  • 如果该文件夹不存在,我的目标是根据单元格 A1 的内容创建一个新文件夹,并将文件保存在该文件夹中。如果文件夹已存在,则将文件保存在现有文件夹中。文件名将在单元格 A2 中。

  • 我想保存一份副本,并将原始文件保留在原处。

【问题讨论】:

  • 在你的脚本中,好像当输入FOLDER_ID的文件夹名称是NEW_FOLDER_NAME时,返回的是文件夹ID,而当输入FOLDER_ID的文件夹名称不是@ 987654325@,返回新建文件夹的文件夹ID为NEW_FOLDER_NAME。所以我无法理解I've not been able to figure out how to modify the following code to save my spreadsheet into the newly created/already existing folder.。你能解释一下你的目标的细节吗?
  • 如果该文件夹不存在,我的目标是根据 A1 的内容创建一个新文件夹并将文件保存在该文件夹中。如果文件夹已经存在,则将文件保存在现有文件夹中,文件名在A2中。
  • 感谢您的回复。我注意到已经发布了 2 个答案。在这种情况下,我想尊重他们。我认为这些将解决您的问题。
  • 嗨,我根据您在 Yuri Khristich 提供的答案下方提供的 cmets 在我的答案中编辑了我的代码 sn-p(您想要复制文件并指定复制的文件名)。我还提供了函数createFolder 的替代代码,这将减少它的大小和复杂性。我希望这对你有帮助。

标签: google-apps-script google-sheets


【解决方案1】:

自 2020 年 9 月 30 日起,云端硬盘文件不能有多个父文件夹。

因此,您应该将文件移至新文件夹,或制作文件副本。但是你不能在两个不同的文件夹中拥有同一个文件。

如果要将文件移动到新文件夹,则应使用moveTo(destination),如果要将文件复制到新文件夹,则应使用makeCopy(destination)

更新:您在 cmets 中提到要复制文件(而不是移动它)并指定复制文件的名称(对应于 A2 中的值)。因此,您应该使用makeCopy(name, destination)

考虑到您要保存活动的电子表格,您的主要功能可能是这样的:

function start(){
  var PARENT_FOLDER_ID = 'my folder id';
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var NEW_FOLDER_NAME = sheet.getRange('A1').getValue();
  var FILE_NAME = sheet.getRange('A2').getValue();
  var spreadsheetId = ss.getId();
  var file = DriveApp.getFileById(spreadsheetId);
  var folder = createFolder(PARENT_FOLDER_ID, NEW_FOLDER_NAME);
  file.makeCopy(FILE_NAME, folder);
}

而函数createFolder的大小可以大大减小,使用Folder.getFoldersByName(name)

function createFolder(folderID, folderName){
  var parentFolder = DriveApp.getFolderById(folderID);
  var subFolders = parentFolder.getFoldersByName(folderName);
  if (subFolders.hasNext()) return subFolders.next(); // Return existing folder
  else return parentFolder.createFolder(folderName); // Return created folder
}

注意事项:

  • 由于 Drive 中的这种行为变化,addFile(child) 等方法已被弃用。

参考:

【讨论】:

  • parentFolder.getFoldersByName(folderName); 是的,这确实是一个聪明的方法。谢谢,我会用的。
  • 这很酷。我喜欢创建文件夹位。谢谢!!
【解决方案2】:

您示例中的脚本会创建一个新文件夹。据我所知,它并没有保存任何东西。

如果您只想将当前的电子表格保存在某个已经存在的文件夹中,请点击此处:

var id     = SpreadsheetApp.getActiveSpreadsheet().getId();
var file   = DriveApp.getFileById(id);
var folder = DriveApp.getFolderById("FOLDER_ID");  // <-- ID of the destination folder

folder.addFile(file);

更新。如果您知道目标文件夹的名称并且该文件夹与当前电子表格文件共享相同的父文件夹,则脚本可能如下所示:

var ss               = SpreadsheetApp.getActiveSheet();
var dest_folder_name = ss.getRange('A1').getValue();
var copy_name        = ss.getRange('A2').getValue();

var dest_folder      = "";
var file_id          = SpreadsheetApp.getActiveSpreadsheet().getId();
var file             = DriveApp.getFileById(file_id);
var parent_folder    = file.getParents().next();
var sub_folders      = parent_folder.getFolders();

// search a destination folder in current folder
while (sub_folders.hasNext()) {
    dest_folder = sub_folders.next();
    if (dest_folder.getName() === dest_folder_name) {
        break;
    }
    dest_folder = "";
}

// create the destination folder if nothing was found
if (dest_folder === "") {
    dest_folder = parent_folder.createFolder(dest_folder_name);
}

// copy the spreadsheet to the destination folder
file.makeCopy(copy_name, dest_folder);

脚本会在当前文件夹中查找目标文件夹(名称取自单元格“A1”),如果没有找到则创建文件夹。之后,它会保存当前电子表格的副本(名称取自单元格“A2”)。

注意。 GoogleDrive 允许在一个文件夹中使用相同名称的文件或子文件夹。因此,获得许多具有相同名称的电子表格并非不可能。也许在保存之前检查现有文件的名称是有意义的。

【讨论】:

  • 抱歉,我没有很清楚地解释我的目标。如果该文件夹不存在,我的目标是根据单元格 A1 的内容创建一个新文件夹,并将文件保存在该文件夹中。如果文件夹已存在,则将文件保存在现有文件夹中。文件名将在单元格 A2 中。
  • 所以您几乎拥有所需的一切。您的脚本成功创建了文件夹(虽然它的名称来自“A2”)。可能在我的示例中,您需要将最后一行更改为file.moveTo(folder)。并添加类似var name = SpreadsheetApp.getActiveSheet().getRange('A2').getValue(); SpreadsheetApp.getActiveSpreadsheet().rename(name) 的东西。
  • 我的文件夹名称可以是任何名称。我可以看到脚本获取了文件夹 ID,但我不知道它是否存储在某个地方。我想我需要类似 file.moveTo(无论找到/创建的文件夹是什么),但我想保存一个副本,并将原始文件保留在原处。
  • 如果您需要复制,请使用命令file.makeCopy(folder)。但同样,您应该有一个目标文件夹的文件夹 ID。如果您知道目标文件夹名称并且确定该文件夹与您当前的电子表格文件共享同一个父文件夹,您可以从您的脚本中获取文件夹 ID(var folder_list = parentFolder.getFolders() 等)。这是一项非常琐碎的任务,我想我可以做到,但我不确定我是否正确理解了您的任务。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2018-07-10
  • 2020-07-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多