使用脚本编辑器将 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());
}
参考资料
这是我现在的代码。
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
以这种方式获取文件夹 IDvar 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());
}