我使用腳本將我的所有檔案從驅動器帶到帶有名稱、url 的谷歌電子表格...
我的問題是有很多檔案,并且腳本在大約 30 分鐘內運行,并且超過了應用腳本的時間權限。
請問我怎樣才能加快這個腳本的速度?
function listFilesAndFolders() {
var folderid = " "; // change FolderID
var sh = SpreadsheetApp.getActiveSheet();
sh.clear();
sh.appendRow(["parent","folder", "name", "update", "Size", "URL", "ID", "description", "type"]);
try {
var parentFolder =DriveApp.getFolderById(folderid);
listFiles(parentFolder,parentFolder.getName())
listSubFolders(parentFolder,parentFolder.getName());
} catch (e) {
Logger.log(e.toString());
}
}
function listSubFolders(parentFolder,parent) {
var childFolders = parentFolder.getFolders();
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
Logger.log("Fold : " childFolder.getName());
listFiles(childFolder,parent)
listSubFolders(childFolder,parent "|" childFolder.getName());
}
}
function listFiles(fold,parent){
var sh = SpreadsheetApp.getActiveSheet();
var data = [];
var files = fold.getFiles();
while (files.hasNext()) {
var file = files.next();
data = [
parent,
fold.getName(),
file.getName(),
file.getLastUpdated(),
file.getSize(),
file.getUrl(),
file.getId(),
file.getDescription(),
file.getMimeType()
];
sh.appendRow(data);
}
}
uj5u.com熱心網友回復:
而不是使用Sheet.appendRow() 收集陣列中的每一行,rows并在所有完成回圈時使用.getRange().setValues().
function listFilesAndFolders() {
var folderid = " "; // change FolderID
var sh = SpreadsheetApp.getActiveSheet();
sh.clear();
let rows = [["parent","folder", "name", "update", "Size", "URL", "ID", "description", "type"]];
try {
var parentFolder =DriveApp.getFolderById(folderid);
listFiles(parentFolder,parentFolder.getName(), rows )
listSubFolders(parentFolder,parentFolder.getName());
sh.getRange(sh.getLastRow() 1,1,rows.length,rows[0].length).setValues(rows);
} catch (e) {
Logger.log(e.toString());
}
}
function listSubFolders(parentFolder,parent) {
var childFolders = parentFolder.getFolders();
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
Logger.log("Fold : " childFolder.getName());
listFiles(childFolder,parent)
listSubFolders(childFolder,parent "|" childFolder.getName());
}
}
function listFiles(fold,parent, rows ){
var sh = SpreadsheetApp.getActiveSheet();
var files = fold.getFiles();
while (files.hasNext()) {
var file = files.next();
rows.push([
parent,
fold.getName(),
file.getName(),
file.getLastUpdated(),
file.getSize(),
file.getUrl(),
file.getId(),
file.getDescription(),
file.getMimeType()
]);
}
}
uj5u.com熱心網友回復:
這會將驅動器中的所有檔案和檔案夾列出到 Sheet1
function getFnF1(folder = DriveApp.getRootFolder()) {
let tree = JSON.parse(PropertiesService.getScriptProperties().getProperty('FnF'));
//Logger.log(JSON.stringify(tree));
if (tree.level < level) {
tree.level = level;
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
}
const files = folder.getFiles();
let row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = folder.getName(); } else { x = ''; } return x; }));
tree.txt.push(row);
row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = 'bold'; } else { x = 'normal'; } return x; }));
tree.fwt.push(row);
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
if (files.hasNext()) {
let row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = 'Files:'; } else { x = ''; } return x; }));
tree.txt.push(row);
tree.fwt.push(['normal']);
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
}
while (files.hasNext()) {
let file = files.next();
let row = Array.from([...Array(level 1).keys()], ((x, i) => { if (i == level) { x = file.getName(); } else { x = ''; } return x; }));
tree.txt.push(row);
tree.fwt.push(['normal']);
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
}
const subfolders = folder.getFolders()
while (subfolders.hasNext()) {
let subfolder = subfolders.next();
level ;
getFnF1(subfolder);
}
level--;
}
function getFilesAndFolders1() {
const fldr = null;
const ss = SpreadsheetApp.getActive();
ss.toast("Entry");
const sh = ss.getSheetByName('Sheet1');
sh.clearContents();
SpreadsheetApp.flush();
PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify({ txt: [], fwt: [], level: 0 }));
getFnF1();
//Logger.log(PropertiesService.getScriptProperties().getProperty('FnF'));
let tree = JSON.parse(PropertiesService.getScriptProperties().getProperty('FnF'));
const l = tree.level 1
tree.txt.forEach(r => {
if (r.length < l) {
//Array.from(Array(l - r.length).keys()).forEach(e => r.push(''));
r.splice(r.length, 0, ...Array(l - r.length).fill(''));
}
});
tree.fwt.forEach(r => {
if (r.length < l) {
//Array.from(Array(l - r.length).keys()).forEach(e => r.push('normal'));
r.splice(r.length, 0, ...Array(l - r.length).fill('normal'));
}
});
//Logger.log(JSON.stringify(tree));
sh.getRange(1, 1, tree.txt.length, tree.level 1).setValues(tree.txt);
sh.getRange(1, 1, tree.fwt.length, tree.level 1).setFontWeights(tree.fwt);
PropertiesService.getScriptProperties().deleteProperty('FnF');
ss.toast("EOF");
}
我的車程大約需要 3 分鐘。我保持我的驅動器很干凈,我沒有列出你想要的那么多引數。
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您想降低腳本的處理成本。
修改點:
- 在您的腳本中,
appendRow在回圈中使用。在這種情況下,處理成本變高。參考:作者我 - 我認為使用Drive API時,處理成本可能會降低一點。
當這些點反映在你的腳本中時,下面的修改怎么樣?在此修改中,使用了 Google Apps 腳本庫。這個FilesApp的 Google Apps 腳本庫的作者是我。
用法:
1. 安裝 Google Apps 腳本庫。
您可以在此處查看如何安裝 [FilesApp] 的 Google Apps 腳本庫。
2.啟用驅動API。
此修改后的腳本使用 Drive API。因此,請在 Advanced Google services 中啟用 Drive API。
3. 示例腳本。
請將以下腳本復制并粘貼到電子表格的腳本編輯器中。并且,請將頂部檔案夾 ID 設定為folderId. 如果您使用var folderId = "root";,將檢索您 Google Drive 中的所有檔案。
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);
}
參考:
- Google Apps 腳本庫的 FilesApp(作者本人)
- 檔案:Drive API v3 串列
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/530088.html
標籤:javascript数组谷歌应用脚本谷歌表格谷歌驱动API
下一篇:angular-gridster2.mjs,錯誤:在“rxjs”中找不到匯出“debounceTime”(匯入為“debounceTime”)
