所以,我有一個名為“Evaluation”的檔案夾,該檔案夾有兩個名為“N1”和“N2”的子檔案夾。其中每一個都有 5 個子檔案夾,分別稱為“A”、“B”、“C”、“D”和“E”。
現在,在檔案夾 A、B、C、D、E 中,我有幾張 google 表格:它們都具有相同的結構。在每個作業簿中,都有一張名為“摘要”的作業表。
我想從這個摘要表中將 A1:C32 范圍復制到主表中,但我不知道如何。我在這里找到了一個代碼,但是如果我更改檔案夾的特定路徑(我鏈接到一個單元格),它就可以作業;它在子檔案夾中不起作用,所以每次我想提取資訊時都必須更改它。
有沒有一種方法可以從所有檔案夾和子檔案夾中更新我的代碼 for 回圈,而無需我與代碼進行互動?這就是我到目前為止所擁有的。
function getdata() {
//múltiples variables
var destinationSpreadsheet,destinationSS_ID,destsheet,destrange,file,files,
sourcerange,sourceSS,sourcesheet,srcSheetName,sourcevalues;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var FolderDestino = ss.getSheetByName("SetUp").getRange('C1').getValue();
srcSheetName = "Resumen";
destinationSS_ID = "1v2Ga6SLgDBVzC4rxTt0dO6P3FGMPDM9MVf6-1r4Z4XQ";
files = DriveApp.getFolderById(FolderDestino).getFiles(); //t01
//files = DriveApp.getFolderById("11nqc2K_J4zKjBBIFYj2qvwrCIxf1o7aJ").getFiles(); //t02
//files = DriveApp.getFolderById("1UaQkdZeYj_OQkiBPlgjZOnIGqWb7xk3r").getFiles(); //t03
//files = DriveApp.getFolderById("1E6uW66LVr6nNM3fT77iuIquuEW5UyIxj").getFiles(); //t04
//files = DriveApp.getFolderById("1nEaKpb7YkCWG6LhYdjn3lQDPyQM0ILtu").getFiles(); //t05
destinationSpreadsheet = SpreadsheetApp.openById(destinationSS_ID);
destsheet = destinationSpreadsheet.getSheetByName('Base');
while (files.hasNext()) {
file = files.next();
if (file.getMimeType() !== "application/vnd.google-apps.spreadsheet") {
continue;
};
sourceSS = SpreadsheetApp.openById(file.getId());
sourcesheet = sourceSS.getSheetByName(srcSheetName);
//sourcesheet.getRange(start row, start column, numRows, number of Columns)
sourcerange = sourcesheet.getRange(8,1,sourcesheet.getLastRow()-1,3);
sourcevalues = sourcerange.getValues();
//Write all the new data to the end of this data
destrange = destinationSpreadsheet.getSheetByName("Base")
.getRange(destsheet.getLastRow() 1,1,sourcevalues.length,sourcevalues[0].length);
destrange.setValues(sourcevalues);
};
};
任何幫助,將不勝感激。
uj5u.com熱心網友回復:
這是一個遞回的基本示例,我希望它與您需要的類似。
需要的一件事是遍歷樹的函式訪問外部靜態記憶體的方法,以便我們可以在必須退出或遞回到另一個級別時保存資料,我通常使用 cacheService 或 PropertiesService。在微處理器的早期,我使用圍繞 cpu 開發自己的高速快取來滿足這種需求,如果你有這種記憶體訪問,遞回回圈可以比大多數其他型別的結構化編程運行得更快。雖然,對于那些不熟悉它們的人來說,除錯它們可能相當困難。我不得不承認我認為這是一個巨大的優勢。
第一個函式通過找到起始檔案夾并呼叫將遍歷樹的函式來開始滾動。
function getFileIds() {
const evalFolder = DriveApp.getFolderById(gobj.globals.testfolderid);
let fid = [];
PropertiesService.getScriptProperties().setProperty("fid",JSON.stringify(fid));
getff(evalFolder);
fid = JSON.parse(PropertiesService.getScriptProperties().getProperty("fid"));
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet0");
sh.clearContents();
let o = fid.map(id => [id]);
o.unshift(['IDs']);
sh.getRange(1,1,o.length,o[0].length).setValues(o);//now you have a list of all of these spreadsheet id's in your folders and you can now easily access them sequentially for building your report.
}
function getff(folder) {
let fid = JSON.parse(PropertiesService.getScriptProperties().getProperty("fid"));
let files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
while(files.hasNext()) {
let file = files.next();
let ss = SpreadsheetApp.openById(file.getId());
if(ss.getSheets().filter(sh => sh.getName() == "Summary").length == 1) {
fid.push(file.getId());
PropertiesService.getScriptProperties().setProperty("fid",JSON.stringify(fid));
}
}
let subfolders = folder.getFolders();
while(subfolders.hasNext()) {
let subfolder = subfolders.next();
getff(subfolder);
}
}
復制粘貼所有資料到master
function copyPaste() {
const ss = SpreadsheetApp.getActive();
const msh = ss.getSheetByName("Master");
const idsh = ss.getSheetByName("Sheet0");
const ids = idsh.getRange(2,1,idsh.getLastRow() - 1).getValues().flat();
ids.forEach(id => {
let ss = SpreadsheetApp.openById(id);
let sh = ss.getSheetByName("Summary");
let vs = sh.getRange(A1:C32).getValues()
msh.getRange(msh.getLastRow() 1, 1,vs.length,vs[0].length).setValues(vs);
})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518288.html
上一篇:在R中回圈使用表名
