【发布时间】:2023-01-27 18:30:24
【问题描述】:
我有一个 Google 电子表格,其中有很多包含数据的表格,每张表格在 1-2 到 40-50 行之间。 我还必须注意,我不是程序员,而是根据 Google 的结果来处理这个问题。
我的目标是拥有一个从所有其他工作表收集数据的“主”表和一个“过滤器”表,我可以在其中根据某些值过滤所有“主”数据。
我已经能够让它“有点”工作,但由于数据量大,脚本大部分时间都会超时,主要问题是,列标题并不总是以相同的顺序排列,我得到的数据是很难过滤和处理。
到目前为止,这是有效的:
const URL_LIST_SHEET_NAME = "URL_LIST!";
const FILTER_SHEET = "Filter";
const MASTER_NAME = "Master";
const TEMPLATE_NAME = "Template";
function GET_DATA() {
const dataSheets = SpreadsheetApp.getActiveSpreadsheet()
.getSheets()
for (let s in dataSheets) {
let sheetNm = dataSheets[s].getName();
// Should skip sheets that I don't need, to reduce the time but not really working ???
if (sheetNm === FILTER_SHEET || sheetNm === URL_LIST_SHEET_NAME || sheetNm === MASTER_NAME || sheetNm === TEMPLATE_NAME) { continue; }
const ranges = dataSheets
.map(info => info.getRange("A2:F30")); //if I put info.getDataRange() here it doesn't work
return ranges
.reduce((result, range) => result.concat(range.getValues()), []);
}
}
我一直在尝试做的是通过组合我发现的不同解决方案,根据标题行对数据进行排序。 到目前为止它没有工作,即使我让它成功执行,“主”表中也没有任何内容。我得到的最常见错误是“TypeError: sheets.getDataRange is not a function”
const URL_LIST_SHEET = "URL_LIST!";
const FILTER_SHEET = "Filter";
const MASTER_NAME_SHEET = "Master";
const TEMPLATE_NAME_SHEET = "Template";
const target_headers = ['firstName', 'companyName', 'BadLinkURL', 'DiscreditProofURL', 'email', 'Niche'];
// Headers I need to sort by, they are not always in the same collums and I need them to be for exporting
function GetColumnValues() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=0; i<sheets.length; i++) {
for (let s in sheets) {
// Gets sheet name.
let sheetNm = sheets[s].getName();
// Skips sheets.
if (sheetNm === FILTER_SHEET || sheetNm === URL_LIST_SHEET || sheetNm === MASTER_NAME_SHEET || sheetNm === TEMPLATE_NAME_SHEET)
{ continue; }
const range = sheets[i].getDataRange(); //With varying data ranges, triming the completely blank rows is a must
const values = range.getValues();
const headers = values.shift();
const columnIndex = headers.indexOf(target_headers);
const columnValues = values.map(row => row[columnIndex]);
return columnValues;
}
}
}
考虑到我正在超时,我可以分批处理 ~30 张,直到全部处理完吗?此工作簿中的工作表数量超过 100 张,而且只会增加,所以我认为这将是执行时间的一个严重问题。
【问题讨论】:
标签: google-apps-script google-sheets