如何使这个 google 脚本更有效率
How to make this google script more efficient
我得到这个脚本来进入一个文件夹并获取每个文件的密钥。
function listFilesInFolder(id) {
var folder = DriveApp.getFolderById('');
var contents = folder.getFiles();
var file;
var name;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Imported");
var date;
var size;
sheet.clear();
sheet.appendRow(["Name", "Data", "Size", "Id"]);
while(contents.hasNext()) {
file = contents.next();
name = file.getName();
date = file.getDateCreated()
size = file.getSize()
id = file.getId()
data = [name, date, size, id]
sheet.appendRow(data);
//appendRow
}
};
我的问题是整个文件夹的浏览时间太长,通常会在完成前达到 运行 时间限制。
该文件夹包含 1000 多个不同的文件,我们每天自动上传文件。
有什么方法可以使这个脚本更有效率吗?
我相信你的目标如下。
- 您想使用 Google Apps 脚本检索特定文件夹下的文件列表。
- 您想减少问题中当前脚本的处理成本。
修改点:
- 在您的脚本中,
appendRow
用于循环。在这种情况下,工艺成本会很高。 Ref
- 而且,我认为在您的情况下,当使用驱动器 API 时,处理成本可能会降低一些。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
在您使用此脚本之前,please enable Drive API at Advanced Google services。
function listFilesInFolder(id) {
var folderId = "###"; // Please set the folder ID. If you want to use "id" for this, you can use var folderId = id;
// 1. Retrieve file list using Drive API.
var ar = [["Name", "Data", "Size", "Id"]];
var pageToken = "";
do {
const res = Drive.Files.list({corpora: "allDrives", includeTeamDriveItems: true, supportsAllDrives: true, maxResults: 1000, pageToken: pageToken, q: `'${folderId}' in parents`});
ar = ar.concat(res.items.map(({title, createdDate, fileSize, id}) => [title, createdDate, fileSize || 0, id]));
pageToken = res.nextPageToken;
} while(pageToken);
// 2. Put the file list to Spreadsheet.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Imported");
sheet.clear();
sheet.getRange(1, 1, ar.length, ar[0].length).setValues(ar);
}
注:
- 从你的问题来看,我无法了解你的具体情况。因此,在此修改后的脚本中,可以搜索您的 Google 驱动器和共享驱动器中的文件夹。
参考文献:
我得到这个脚本来进入一个文件夹并获取每个文件的密钥。
function listFilesInFolder(id) {
var folder = DriveApp.getFolderById('');
var contents = folder.getFiles();
var file;
var name;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Imported");
var date;
var size;
sheet.clear();
sheet.appendRow(["Name", "Data", "Size", "Id"]);
while(contents.hasNext()) {
file = contents.next();
name = file.getName();
date = file.getDateCreated()
size = file.getSize()
id = file.getId()
data = [name, date, size, id]
sheet.appendRow(data);
//appendRow
}
};
我的问题是整个文件夹的浏览时间太长,通常会在完成前达到 运行 时间限制。
该文件夹包含 1000 多个不同的文件,我们每天自动上传文件。
有什么方法可以使这个脚本更有效率吗?
我相信你的目标如下。
- 您想使用 Google Apps 脚本检索特定文件夹下的文件列表。
- 您想减少问题中当前脚本的处理成本。
修改点:
- 在您的脚本中,
appendRow
用于循环。在这种情况下,工艺成本会很高。 Ref - 而且,我认为在您的情况下,当使用驱动器 API 时,处理成本可能会降低一些。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
在您使用此脚本之前,please enable Drive API at Advanced Google services。
function listFilesInFolder(id) {
var folderId = "###"; // Please set the folder ID. If you want to use "id" for this, you can use var folderId = id;
// 1. Retrieve file list using Drive API.
var ar = [["Name", "Data", "Size", "Id"]];
var pageToken = "";
do {
const res = Drive.Files.list({corpora: "allDrives", includeTeamDriveItems: true, supportsAllDrives: true, maxResults: 1000, pageToken: pageToken, q: `'${folderId}' in parents`});
ar = ar.concat(res.items.map(({title, createdDate, fileSize, id}) => [title, createdDate, fileSize || 0, id]));
pageToken = res.nextPageToken;
} while(pageToken);
// 2. Put the file list to Spreadsheet.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Imported");
sheet.clear();
sheet.getRange(1, 1, ar.length, ar[0].length).setValues(ar);
}
注:
- 从你的问题来看,我无法了解你的具体情况。因此,在此修改后的脚本中,可以搜索您的 Google 驱动器和共享驱动器中的文件夹。