Google apps script 获取不同文件夹中文件的ID
这是对此的后续问题 有没有办法让我在不同的文件夹中获取文件的ID?下面是我正在工作的目录 这就是我正在使用的代码Google apps script 获取不同文件夹中文件的ID,google-apps-script,google-sheets,Google Apps Script,Google Sheets,这是对此的后续问题 有没有办法让我在不同的文件夹中获取文件的ID?下面是我正在工作的目录 这就是我正在使用的代码 function myFunction() { const ss = SpreadsheetApp.getActive(); var SSID = ss.getId(); //sheet id var spreadsheetFile = DriveApp.getFileById(SSID); var folderId = spreadsheetFile.g
function myFunction() {
const ss = SpreadsheetApp.getActive();
var SSID = ss.getId(); //sheet id
var spreadsheetFile = DriveApp.getFileById(SSID);
var folderId = spreadsheetFile.getParents().next().getId();
const sh = ss.getSheetByName('Sheet4'); // change that to the name of your sheet
const filenames = sh.getRange('B3:B').getValues().flat().filter(r=>r!='');
const IDs = [];
const Folder = DriveApp.getFolderById(folderId);
filenames.forEach(fn=>{
let Files = Folder.getFilesByName(fn);
while(Files.hasNext()){
let file = Files.next();
IDs.push([file.getId()]);
}
});
sh.getRange(3,3,IDs.length,1).setValues(IDs);
}
如果文件位于文件夹中,则此代码可以正常工作,但不适用于子文件夹或其他文件夹
下面是我正在做的工作表
在这种情况下,为了实现您的目标,下面的流程如何
folderId
中所有文件的文件列表- 在这种情况下,假定电子表格的“B”列中不存在相同的文件名。请小心这个
- 检索
中所有文件的文件列表folderId
- 创建用于将值放入电子表格的数组 当您的脚本被修改时,它将变成如下所示 修改脚本: 发件人: 致: 注:
- 在这种情况下,假定电子表格的“B”列中不存在相同的文件名。请小心这个
- 在这种情况下,为了实现您的目标,以下流程如何
- 这里有几个选项。首先有一种方法,它将返回驱动器中与给定名称匹配的所有文件夹的列表。当然,在运行之前,您需要知道文件夹的名称,并且不能有任何其他同名文件夹,否则您可能会使用错误文件夹的id
如果您知道文件夹树上方某个文件夹的id(如上面示例中所示的脚本直接父级,请参阅),则可以使用来限制上述方法的影响。与上面相同的限制适用于此处,但速度更快(需要迭代的文件更少),但要求您具有父文件夹的id
如果您知道要访问哪个文件,并且在脚本执行期间保持不变,您也可以简单地从url复制文件夹id,并将其存储为常量变量。这种方法当然更加严格,因为您需要在运行之前构造文件;但是,您不需要遍历目录树,因此会更快。这里有几个选项。首先有一种方法,它将返回驱动器中与给定名称匹配的所有文件夹的列表。当然,在运行之前,您需要知道文件夹的名称,并且不能有任何其他同名文件夹,否则您可能会使用错误文件夹的id 如果您知道文件夹树上方某个文件夹的id(如上面示例中所示的脚本直接父级,请参阅),则可以使用来限制上述方法的影响。与上面相同的限制适用于此处,但速度更快(需要迭代的文件更少),但要求您具有父文件夹的id
如果您知道要访问哪个文件,并且在脚本执行期间保持不变,您也可以简单地从url复制文件夹id,并将其存储为常量变量。这种方法当然更加严格,因为您需要在运行之前构造文件;但是,您不需要遍历目录树,因此会更快。只显示代码所在的工作表的ID。其他ID不显示。
folderId
是数据库文件夹的ID。数据库文件夹仅包含一个文件。保存所有ID的文件。也许这就是为什么只有DB_链接
ID显示出来的原因。当我将folderID
的值更改为父文件夹ID时,它起了作用。但是我在放置值时遇到了问题,因为它在确切的行上生成的值与文件名不同。也许我会问另一个问题。但无论如何,谢谢你。@cjvdg谢谢你的回复。关于新问题,我注意到你的新问题。所以我回答了。您能确认一下吗?但有没有办法让我不在代码中输入或声明文件夹ID?更可能的是,它会自动将代码放到那里。只显示代码所在的工作表的ID。其他ID不显示。folderId
是数据库文件夹的ID。数据库文件夹仅包含一个文件。保存所有ID的文件。也许这就是为什么只有DB_链接
ID显示出来的原因。当我将folderID
的值更改为父文件夹ID时,它起了作用。但是我在放置值时遇到了问题,因为它在确切的行上生成的值与文件名不同。也许我会问另一个问题。但无论如何,谢谢你。@cjvdg谢谢你的回复。关于新问题,我注意到你的新问题。所以我回答了。您能确认一下吗?但有没有办法让我不在代码中输入或声明文件夹ID?更有可能它会自动到达那里。我试试这个。谢谢你。我试试这个。谢谢你。
const IDs = [];
const Folder = DriveApp.getFolderById(folderId);
filenames.forEach(fn=>{
let Files = Folder.getFilesByName(fn);
while(Files.hasNext()){
let file = Files.next();
IDs.push([file.getId()]);
}
});
const Folder = DriveApp.getFolderById(folderId);
// 1. Retrieve the file list of all files in `folderId`.
const getFileList = (f, folders = [], fileList = {}) => {
const fs = f.getFiles();
while (fs.hasNext()) {
const file = fs.next()
fileList[file.getName()] = file.getId();
}
const fols = f.getFolders();
const folderObjs = [];
while (fols.hasNext()) folderObjs.push(fols.next());
if (folderObjs.length > 0) {
folders.push(folderObjs);
folderObjs.forEach(fol => getFileList(fol, folders, fileList));
}
return fileList;
};
const fileList = getFileList(Folder);
// 2. Create an array for putting values to Spreadsheet.
const IDs = filenames.map(fn => [fileList[fn] || ""]);