Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 获取不同文件夹中文件的ID_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 获取不同文件夹中文件的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

这是对此的后续问题

有没有办法让我在不同的文件夹中获取文件的ID?下面是我正在工作的目录

这就是我正在使用的代码

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