【发布时间】:2021-11-22 09:51:15
【问题描述】:
我已经使用 Google App Script(在 javascript 中)编写了一个脚本,并且我正在寻找一种方法来最好地优化基于一个或多个搜索字段返回对象的函数。数据存储在 Google 表格中。我的 UI 将参数传递给我的函数,然后我遍历给定的工作表以查找符合条件的行,并将单元格添加到要返回的对象中。返回的可能只是一个对象或对象列表。在大多数情况下,这很好用,但如果我将这种类型的函数嵌套在一个循环中,它真的会拖累性能。任何有关如何提高性能的建议将不胜感激。这是我的代码示例:
function GetAllReportByOrgID_DataLayer_(org_id, reporting_periods) {
//get all reporting period for program
var rows = GetDataRows_(DATA_SPREAD_SHEET_ID, RESPONSE_PAGE);
var surveys = [];
for (var i = 1; i < rows.length; i++) {
var row = rows[i];
var found_org_id = row[2];
var found_is_active = row[13];
if (found_org_id == org_id && found_is_active == true ) {
var survey = {};
survey.indicator_id = row[0];
survey.program_id = row[1];
survey.org_guid = row[2];
survey.survey_response = row[3];
survey.reporting_period = row[5];
survey.reporting_period_name = GetReportingPeriodNameById_(row[5], reporting_periods);
survey.is_final_report = row[6];
survey.is_submitted = row[7];
survey.submitted_by = row[8];
survey.submitted_by_email = row[9];
survey.date_created = ConvertUnixTimeStampToDateTime_(row[10]);
survey.date_updated = ConvertUnixTimeStampToDateTime_(row[11]);
survey.fiscal_year = row[12];
survey.documents = GetDocumentsById_DataLayer_({
program_id: row[13]
});
surveys.push(survey);
}
}
surveys.success = true;
return surveys;
}
function GetDataRows_(Sheet_Id, SheetName) {
var sheet = GetSheet_(Sheet_Id, SheetName);
var rows = [];
if (sheet) {
rows = sheet.getDataRange().getValues();
}
return rows;
}
function GetSheet_(Sheet_Id, SheetName) {
var ss = SpreadsheetApp.openById(Sheet_Id);
var sheet = ss.getSheetByName(SheetName);
return sheet;
}
function GetReportingPeriodNameById_(id, reporting_periods) {
if (id) {
for (var i = 0; i < reporting_periods.length; i++) {
if (reporting_periods[i].id == id) {
return reporting_periods[i].value
}
}
return "Reporting Period Not Found"
} else {
return "Reporting Period Not Found"
}
}
function GetDocumentsById_DataLayer_(data) {
var rows = GetDataRows_(DATA_SPREAD_SHEET_ID, PROGAM_DOCUMENTS_PAGE);
var documents = [];
var program_id = data.program_id.trim();
for (var i = 1; i < rows.length; i++) {
var row = rows[i];
var found_program_id = row[1];
var is_active = row[6];
if(is_active === true){
if (found_program_id === program_id) {
var document = {};
document.document_id = row[0];
document.program_id = row[1];
document.document_name = row[2];
document.file_id = row[3];
document.file_name = row[4];
document.file_url = row[5]
document.date_created = ConvertUnixTimeStampToDateTime_(row[7]);
document.date_updated = ConvertUnixTimeStampToDateTime_(row[8]);
documents.push(document);
}
}
}
documents.success = true;
return documents;
}
function ConvertUnixTimeStampToDateTime_(unix_timestamp) {
if (!unix_timestamp) {
return "";
}
var a = new Date(unix_timestamp * 1000);
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
var sec = a.getSeconds();
var time = a.getMonth() + "/" + date + "/" + year + " " + hour + ":" + min + ":" + sec;
return time;
}
这段代码大部分都可以正常工作,除非它在一个被调用 100 次左右的循环中,然后事情会滞后并且可能需要一分钟或更长时间来处理。工作表并没有那么大,不到 200 行和 15 列。
谢谢
【问题讨论】:
-
你的问题太笼统了。典型答案将被阅读并实施最佳实践,如果您需要其他帮助,请返回。您似乎有几个帮助函数,我将它们包含在一个函数中只是为了节省时间。
-
ConvertUnixTimeStampToDateTime_(row[7]);未定义 -
@Cooper 我不认为值得投入,因为它只是转换 Unix 时间。我可以添加它。但更大的问题似乎是嵌套调用。
-
无论你提供什么都应该满足minimal reproducible example的要求。我会说您应该删除所有辅助函数,尤其是当它们调用其他函数以最小化运行时。
-
您是否在使用 HTML 页面并在应用程序脚本中调用服务器端函数?关于这个
function nested in a loop it can really drag the performance是你客户端的循环吗?正如@Cooper 所提到的,如果您能提供minimal reproducible example 以供我们验证可能提出的解决方案是否会提高您当前的性能,我将不胜感激。我基本上很好奇嵌套循环发生在哪里
标签: javascript jquery performance google-apps-script google-sheets