使用脚本编辑器将 Excel 文件从 Google 驱动器复制到新创建的文件夹

Copying an Excel file from Google Drive to a newly created Folder using Script Editor

这是我现在的代码。

function copyfile() {
var ss = SpreadsheetApp.getActive();
var activeSheet = ss.getSheetByName("sheet_Patients");
var activeSheetFM = ss.getSheetByName("_FolderMaker_");
var lastRow = activeSheet.getLastRow();
var data = activeSheet.getRange(lastRow,3,1,1).getValues();
var secondData = activeSheet.getRange(lastRow,4,1,1).getValues();
var folder_Name = [data+ ", " +secondData];

var id = DriveApp.getFoldersByName(folder_Name);
var finalId = activeSheetFM.getRange(2,4,1,1).setValue(id);

//var file = DriveApp.getFileById("1g25_24OTv_t5Qav2Q1hwEM_YBiPSaWWb");
//var source_folder = DriveApp.getFolderById("1pqh74miSSy9WDSD3kpi02kkI6XDuXiuU");
//var dest_folder = DriveApp.getFoldersByName(finalId);
//
//var file2 = file.makeCopy('BACKUP ' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd') + '.' + file.getName());
//dest_folder.addFile(file2);
//source_folder.removeFile(file2);
}

所以我的目标是通过使用

从传播sheet中获取文件夹名称
var data = activeSheet.getRange(lastRow,3,1,1).getValues();
var secondData = activeSheet.getRange(lastRow,4,1,1).getValues();
var folder_Name = [data+ ", " +secondData];

然后组合成数组在

上使用
var id = DriveApp.getFoldersByName(folder_Name);

并希望通过将值设置回单独的 sheet

以这种方式获取文件夹 ID
var finalId = activeSheetFM.getRange(2,4,1,1).setValue(id);

但它 returns 作为“FolderIterator”。我什至不确定这种方法是否可行,因为我是编码新手。

问题:

  • 代码中的第一个问题是您想要获取 单个 单元格的值:

    var data = activeSheet.getRange(lastRow,3,1,1).getValues();
    var secondData = activeSheet.getRange(lastRow,4,1,1).getValues();
    

    但您正在使用 getValues,其中 return 是一个 2D 数组。因此,您需要将 getValues 替换为 getValue.

  • 最后但同样重要的是,folders 是一个 FolderIterator 对象,正如错误所暗示的那样。也就是说,您需要以与我的解决方案相同的方式对其进行迭代。请记住,如果您有多个同名文件夹,则需要更改此方法以获取您选择的文件夹。因为这种方法将 return 多个 ID 对应于具有该名称的每个文件。


解决方案:

function copyfile() {
var ss = SpreadsheetApp.getActive();
var activeSheet = ss.getSheetByName("sheet_Patients");
var activeSheetFM = ss.getSheetByName("_FolderMaker_");
var lastRow = activeSheet.getLastRow();
var data = activeSheet.getRange(lastRow,3,1,1).getValue();
var secondData = activeSheet.getRange(lastRow,4,1,1).getValue();
var folder_Name = data+ ", " +secondData;

var folders = DriveApp.getFoldersByName(folder_Name);
while (folders.hasNext()) {
      const folder = folders.next();
      var id = folder.getId(); 
} 
var finalId = activeSheetFM.getRange(2,4,1,1).setValue(id);
}

相关文章:

  • What does the range method getValues() return and setValues() accept?
  • Searching for a Google-apps-script to iterate through a folder of sheets and append a range of data to a consolidated master sheet

这段代码有两个主要问题:

第 1 期 - getValues

当您调用 getValues 时,如果您有这样的 Sheet:

如果你在整个范围内调用它,它将 return:

[
[1,2,3],
[4,5,6],
[7,8,9],
]

如果您创建一个仅引用一个单元格的范围对象,例如 A1,您将得到:

[[1]]

您可以使用 getValue(不带 s)来 return 实际值 。因此,如果您在 A1 范围内使用 getValue,它将 return:

1

第 2 期 - FolderIterator

当你这样调用时:

var id = DriveApp.getFoldersByName(folder_Name);

变量id变成了FolderIterator。所以这个变量更好的命名是folders。即使只有一个文件夹,它仍然 return 是一个迭代器,你可以把它想象成一个列表。要获取该列表中文件夹的实际 ID:

var folders = DriveApp.getFoldersByName(folder_Name);
while (folders.hasNext()) {
  var folder = folders.next();
  Logger.log(folder.getId());
}

参考资料