删除当前项目在Javascript而hasNext-loop?



我已经阅读了10多个关于在javascript循环中删除项目的问题,但它们似乎不适用于我的情况。

我有这个代码

var childFolders = parent.getFolders();

// List folders inside the folder
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
//processing childFolder

之后,我想从数组childFolders中删除当前项(childFolder)。原因是我正在做一些工作在谷歌应用程序脚本,但它往往需要太长时间和超时,所以我需要能够重新启动循环,只有在数组中留下未处理的项目。为了实现这一点,在每个循环中,我将childFolders的内容复制到一个永久存储中,以便在下次运行时恢复。

我相信你的目标是这样的。

  • 你想停止文件夹迭代器的循环,当你再次运行脚本时,你想从已经停止的迭代器中启动文件夹迭代器。

在这种情况下,使用"ContinuationToken"如何?当"ContinuationToken"我认为你的目标可以通过Google Apps Script的本地方法来实现。当这反映在您的脚本中时,下面的脚本如何?

示例脚本:

请设置var parent = DriveApp.getFolderById("###");

// When you want to clear the token, please run this function.
function clearToken() {
PropertiesService.getScriptProperties().deleteProperty("token");
}
// This is the main function.
function main() {
var parent = DriveApp.getFolderById("###"); // Please set your parent folder.
var numberOfLoop = 2; // The folder iterator is run every this number.
var p = PropertiesService.getScriptProperties();
var token = p.getProperty("token");
var childFolders = token ? DriveApp.continueFolderIterator(token) : parent.getFolders();
var count = 0;
while (childFolders.hasNext()) {
count++;
var childFolder = childFolders.next();
//processing childFolder
console.log(childFolder.getName()); // This is a sample.
if (count == numberOfLoop) {
var token = childFolders.getContinuationToken();
p.setProperty("token", token);
break;
}
}
}
  • 当您运行main函数时,在这个示例脚本中,将处理2个文件夹,脚本完成。当您再次运行main时,文件夹迭代器将从continuation开始。

  • 当您想从第一个文件夹迭代器开始时,请运行clearToken.

引用:

  • getContinuationToken() of Class FolderIterator
  • continueFolderIterator(continuationToken) of Class DriveApp

补充道:

从你的以下回复,

这是在步骤3这里的脚本ourtechroom.com/fix/…我有问题。我将其更改为首先将所有文件添加到数组中,然后在最后的单独步骤中将它们插入到工作表中,但这还不够。这就是我的问题。

我的问题是你的解决方案对我来说有点太复杂了。也就是说,我很难将您的解决方案应用到链接中的脚本中。

是否要检索Google Drive中所有文件的文件元数据?如果我的理解是正确的,我认为你链接中的脚本是一个很高的过程成本,因为appendRow在循环中使用。我想这可能是你实际情况的原因。如果我的理解是正确的,那么下面的样例脚本呢?

用法:

1。安装Google Apps Script库

你可以在这里看到如何安装谷歌应用程序脚本库[FilesApp]。

2。启用Drive API

修改后的脚本使用Drive API。因此,请在高级谷歌服务中启用驱动器API。

3。示例脚本。

请将以下脚本复制粘贴到电子表格的脚本编辑器中。并且,请将顶部文件夹ID设置为folderId。如果你使用var folderId = "root";,所有文件在你的谷歌驱动器检索。

function myFunction() {
var folderId = "###"; // Please set the top folder ID.

var header = ["parent", "folder", "name", "update", "Size", "URL", "ID", "description", "type"]; // This is from your script.
var obj = FilesApp.createTree(folderId, null, "files(name,modifiedTime,size,webViewLink,id,description,mimeType)");
var values = [header, ...obj.files.flatMap(({ folderTreeByName, filesInFolder }) => {
const f = [folderTreeByName.join("|"), folderTreeByName.pop()];
return filesInFolder.length == 0 ? [[...f, ...Array(7).fill(null)]] : filesInFolder.filter(({ mimeType }) => mimeType != MimeType.FOLDER).map(({ name, modifiedTime, size, webViewLink, id, description, mimeType }) => [...f, name || null, new Date(modifiedTime), size || 0, webViewLink, id, description || null, mimeType]);
})];
SpreadsheetApp.getActiveSheet().clear().getRange(1, 1, values.length, values[0].length).setValues(values);
}

引用:

  • FilesApp of Google Apps Script library (Author me)
  • Files: Drive API v3列表

最新更新