【问题标题】:Copying an Excel file from Google Drive to a newly created Folder using Script Editor使用脚本编辑器将 Excel 文件从 Google Drive 复制到新创建的文件夹
【发布时间】:2021-02-08 15:35:23
【问题描述】:

这就是我现在拥有的代码。

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);
}

所以我的目标是通过使用从电子表格中获取文件夹名称

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);

并希望通过将值设置回单独的工作表来以这种方式获取文件夹 ID

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

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

【问题讨论】:

    标签: google-apps-script google-sheets google-workspace


    【解决方案1】:

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

    第一期 - getValues

    当您致电getValues 时,如果您有这样的工作表:

    你在整个范围内调用它,它会返回:

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

    如果你创建一个只引用一个单元格的范围对象,比如A1,你会得到:

    [[1]]
    

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

    1
    

    第二期 - FolderIterator

    当你调用它时:

    var id = DriveApp.getFoldersByName(folder_Name);
    

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

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

    参考文献

    【讨论】:

    • 感谢您指出。我在 Apps 脚本参考中找到了类似的条目。
    【解决方案2】:

    问题:

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

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

      但您使用的是 getValues,它返回一个 2D 数组。因此,您需要将getValues 替换为getValue

    • 最后但同样重要的是,folders 是一个 FolderIterator 对象,正如错误所暗示的那样。也就是说,您需要以与我的解决方案相同的方式对其进行迭代。请记住,如果您有多个同名文件夹,则需要更改此方法以获取您选择的文件夹。因为这种方法会返回对应于每个同名文件的多个 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);
    }
    

    相关文章:

    【讨论】:

    • 感谢您的帮助。我只是注意到在代码的末尾我使用了似乎已弃用的 .addFile 。我尝试使用 MoveTo,但它似乎不起作用。
    • @Naeed 你能就这个问题发表一个新问题吗? Stackoverflow 不允许提出后续问题。非常感谢,给您带来的不便深表歉意。
    • 没问题。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2013-06-26
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多