希望了解如何改进循环的使用。目前,我需要将 google 驱动器文件夹中的名称和 URL 列出到工作表中,这是我拥有的代码:
现有代码
function wthFolderContents() {
var folder_id = 'myFolderID';
var folders = DriveApp.getFolderById(folder_id)
var contents = folders.getFiles();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("SheetName");
sheet.clearContents()
sheet.appendRow( ['name', 'link'] );
var file;
var name;
var link;
var row;
while(contents.hasNext()) {
file = contents.next();
name = file.getName();
link = file.getUrl();
sheet.appendRow ( [name, link] );
使用此代码,每次运行脚本时,内容都会被清除,然后重新列出。我正在寻找一种动态执行此操作的方法/仅更新新文件,以便脚本运行更有效。
我尝试过以下方法
新代码
function wthFolderContents2() {
var folder_id = '1vBzucZsb0SMOoHSWGtkUF-5QLQr5Fh1C';
var folders = DriveApp.getFolderById(folder_id)
var contents = folders.getFiles();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("WHTCert");
var lastRow = sheet.getLastRow()
var existing = sheet.getRange(1,1,lastRow,1).getValues()
for(i=1;i<lastRow;i++) {
var existingFilename = existing [i][0]
Logger.log(existingFilename)
while(contents.hasNext()) {
var file;
var name;
var link;
file = contents.next();
name = file.getName();
link = file.getUrl();
if (!name == existingFilename) {
sheet.appendRow ( [name, link] );
}
}
}
我无法让它工作,不知道我到底哪里出了问题。希望有人能指出我正确的方向!
干杯
我相信您的目标如下。
appendRow
。在这种情况下,工艺成本将会变高。 参考在您的情况下,您似乎想检索特定文件夹下的文件列表。在这种情况下,我认为当使用Drive API时,可以降低流程成本。在这个答案中,我想建议在您的脚本中使用 Drive API。当这反映在你的脚本中时,它会变成如下所示。
使用Drive API时,可以检索所有值。所以,我认为你的第一个过程可能可以使用。
在使用此脚本之前,请在高级 Google 服务中启用 Drive API v2。
function wthFolderContents2() {
var folder_id = '1vBzucZsb0SMOoHSWGtkUF-5QLQr5Fh1C';
// Retrieve file list.
var q = `'${folder_id}' in parents and trashed = false and mimeType != '${MimeType.FOLDER}'`;
var fileList = [['name', 'link']];
var pageToken = "";
do {
var obj = Drive.Files.list({ q, maxResults: 1000, pageToken, fields: "nextPageToken,items(id,title)", corpora: "allDrives", supportsAllDrives: true, includeItemsFromAllDrives: true });
if (obj.items.length > 0) {
fileList = [...fileList, ...obj.items.map(({ id, title }) => [title, `https://docs.google.com/presentation/d/${id}/edit?usp=drivesdk`])];
}
pageToken = obj.nextPageToken;
} while (pageToken);
// Put the values to Spreadsheet.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("WHTCert");
sheet.clearContents();
sheet.getRange(1, 1, fileList.length, fileList[0].length).setValues(fileList);
}
现阶段启用Drive API时,默认启用v3版本。所以,也许可以使用以下脚本。
在使用此脚本之前,请在高级 Google 服务中启用 Drive API v3。
function wthFolderContents2() {
var folder_id = '1vBzucZsb0SMOoHSWGtkUF-5QLQr5Fh1C';
// Retrieve file list.
var q = `'${folder_id}' in parents and trashed = false and mimeType != '${MimeType.FOLDER}'`;
var fileList = [['name', 'link']];
var pageToken = "";
do {
var obj = Drive.Files.list({ q, pageSize: 1000, pageToken, fields: "nextPageToken,files(id,name)", corpora: "allDrives", supportsAllDrives: true, includeItemsFromAllDrives: true });
if (obj.files.length > 0) {
fileList = [...fileList, ...obj.files.map(({ id, name }) => [name, `https://docs.google.com/presentation/d/${id}/edit?usp=drivesdk`])];
}
pageToken = obj.nextPageToken;
} while (pageToken);
// Put the values to Spreadsheet.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("WHTCert");
sheet.clearContents();
sheet.getRange(1, 1, fileList.length, fileList[0].length).setValues(fileList);
}
参考资料:
函数 wthFolderContents() 函数 wthFolderContents2()