Googel Apps Script hasNext() returns false



我正在尝试一件非常简单的事情,但似乎无法让它工作

我有许多同名"Facturas 21"的文件位于我的驱动器的不同子文件夹中。我想对它们做一些事情,但由于某种原因我无法使用文件迭代器访问它们。

我的代码非常简单:

function getFiles() {
const drive = DriveApp.getFolderById("XXXXXXXXX");
const files = drive.getFilesByName("Facturas 21");
Logger.log(files.hasNext()); // logs false!
while (files.hasNext()) {
let file = files.next();
... some code
}
}

当存在这些文件是事实时,为什么它给我假的?仅供参考,我已经复制并粘贴了字符串,因此没有拼写错误或打错。 根据文档,getFilesByName()"获取用户云端硬盘中具有给定名称的所有文件的集合"并返回FileIterator对象。我没有看到什么??

您需要遍历整个内容树。云端硬盘不会为您执行此操作。

你得到一个空的FileIterator,大概是因为你在文件夹XXX中没有任何名为"Facturas 21"的文件。

递归调用drive.getFolders(),直到到达子节点。

此行Logger.log(files.hasNext());返回false的原因主要是因为您正在使用预配的 ID 在特定文件夹中执行搜索。

就像另一个答案中提到的,您将不得不遍历整个驱动器树。

但是,您可以使用以下代码片段来列出名为"Facturas 21"的所有文件:

function listFiles() {
var query = "title contains 'Facturas 21'";
let files = Drive.Files.list({q: query}).items;
// code
}

上面的代码利用了Drive高级服务,并从整个驱动器中返回名为"Facturas 21"的所有文件。返回的files变量将是File类型的对象数组,因此根据您期望的最终结果,您可以根据需要操作这些对象。

注意

请注意,Drive高级服务使用的是云端硬盘 API v2。

参考

  • 驱动器 API v2 搜索词;

  • 驱动器 API v2 文件:列表;

  • 应用程序脚本高级驱动器服务。

解释:

根据此链接,类文件迭代器的hasNext()方法返回一个Boolean值。因此,这就是您在运行代码时得到"假"或"真"结果的原因Logger.log(files.hasNext());

此外,我尝试了您的代码,通过在 3 行const files = drive.getFilesByName("Facturas 21.txt");上添加文件的扩展名(在我的情况下是 .txt),我能够获得此处看到的"Facturas 21"文件。这是你只得到错误结果的主要原因。

最新更新