google-apps-script - 用于在 Google 表格中将数据高效写入自定义绑定表单的 GAS 方法
问题描述
function Ex_WriteVolDataToForm(){
var Ss=SpreadsheetApp.getActiveSpreadsheet();
var ShUserForm=Ss.getSheetByName("User Contact Info Form");//User Interface Form
var Search_str = ShUserForm.getRange("C5").getValue();//Searches for Last Name (Entered in 'C5' on the user form)
var SearchRowDisplayed = ShUserForm.getRange("A13").getValue();//The row # of the "VolSearchResult Tbl" record that is currently displayed on the form
var NumberOfSearchFindsLeft = ShUserForm.getRange("C10").getValue();//=n if there are 'n' records to display from the search function; ="0" if NO search Records
var SearchResultDatasheet=Ss.getSheetByName("VolSearchResult Tbl");//Destination Table of data for Name search
var LstSearchColNumber = SearchResultDatasheet.getLastColumn();
var start = new Date(); //This line before operation begins
ResetDataForm(); //Clears all data from 'User Contact Info Form'
//Re-enter the 'hidden' data cleared by the 'ResetDataForm' fcn
ShUserForm.getRange("C10").setValue(NumberOfSearchFindsLeft);//Re-enters in C10 the number of records found from the "VolSearchResult Tbl" or "" [Null] if NOT from "VolSearchResult Tbl"
ShUserForm.getRange("A13").setValue(SearchRowDisplayed);//Re-enters number of the row displayed from the "VolSearchResult Tbl" (to A12) after being cleared by ResetDataForm function
ShUserForm.getRange("C5").setValue(Search_str);//Re-enters Last Name searched (to C5) after being cleared by ResetDataForm function
var FormRangesToSetValues = ["C11", "F10", "B10", "B14", "B16", "B12", "C17", "F14"]
var RowValues = SearchResultDatasheet.getRange(SearchRowDisplayed,1,1,LstSearchColNumber).getValues();//Creates an Array 1x56 items
for (var i=0; i<LstSearchColNumber; i++) { //adjusted for the starting column is '0', so the last column (index) is LstColNumber-3 NOTE: Excludes cells 'BB3' and 'BC' from routine
ShUserForm.getRange(FormRangesToSetValues[i]).setValue(RowValues[0][i]);// Sequentially sets values in form cells from corresponding values in the 'RowValues' array
if (RowValues[0][i]!="") { //True if there IS a value
ShUserForm.getRange(FormRangesToSetValues[i]).setBackground('#dff3ef'); //Sets Cell Bkg color for all item Not equal to "" to lt. green (ALL form cells with data turn Lt. Green)
}
SpreadsheetApp.flush();
}
ShUserForm.activate();//Takes user to the 'Volunteer Information Form'
return //Exit if only one record found
}
我正在寻找一种加快处理速度的方法。整个源电子表格有 56 列数据,每行记录个人数据。从一张表中搜索并写入搜索结果表的速度非常快。该过程中真正缓慢的部分是将数据从搜索结果表写入表单(您会注意到目标表单上的顺序与表单数据的顺序不同)。生成数据数组(从工作表记录中读取)以相当快的速度进行。将数组数据写入表单(所有 56 个字段 + 我用于其他操作的一些常数值),测量时间为 54 秒。据我了解,“批处理”方法仅适用于字符串数据(记录中的数字数据和日期字段很少)。如果你能让我在这个问题上指出正确的方向,我会很感激。感谢您提前提供任何帮助。
//此函数将当前 Google 表格记录的数据复制到用户表单 //** 我用来将数据从 Google 表格复制到自定义表单(在另一个 Google 表格上创建)的函数的缩写版本同一个电子表格。*/
解决方案
我相信你的目标如下。
- 您想降低脚本的处理成本。
在这种情况下,我想建议为您的脚本使用 Sheets API 和范围列表。当您的脚本被修改时,请按如下方式进行修改。
修改后的脚本:
在使用此脚本之前,请在高级 Google 服务中启用 Sheets API。参考
从:
for (var i=0; i<LstSearchColNumber; i++) { //adjusted for the starting column is '0', so the last column (index) is LstColNumber-3 NOTE: Excludes cells 'BB3' and 'BC' from routine
ShUserForm.getRange(FormRangesToSetValues[i]).setValue(RowValues[0][i]);// Sequentially sets values in form cells from corresponding values in the 'RowValues' array
if (RowValues[0][i]!="") { //True if there IS a value
ShUserForm.getRange(FormRangesToSetValues[i]).setBackground('#dff3ef'); //Sets Cell Bkg color for all item Not equal to "" to lt. green (ALL form cells with data turn Lt. Green)
}
SpreadsheetApp.flush();
}
至:
var data = [];
var rangeList = [];
for (var i = 0; i < LstSearchColNumber; i++) {
data.push({range: `'User Contact Info Form'!${FormRangesToSetValues[i]}`, values: [[RowValues[0][i]]]});
if (RowValues[0][i] != "") {
rangeList.push(FormRangesToSetValues[i]);
}
}
Sheets.Spreadsheets.Values.batchUpdate({data: data, valueInputOption: "USER_ENTERED"}, Ss.getId());
ShUserForm.getRangeList(rangeList).setBackground('#dff3ef');
参考:
推荐阅读
- php - 排队的工作卡住了,表可能锁定在 Laravel
- php - 访问。将排除的子文件夹重定向到域的 https 版本,其他所有内容都被重定向到另一个域
- c# - 将动态对象列表转换为字典
- sonarqube - api/issues/search 响应仅在登录时具有“作者”字段
- c# - WPF 如何使用 MVVM 从 ICommand 正确修改视图
- c++ - 无法创建包含日志文件的文件夹
- python - 如何将 Count Morgan 指纹计算为 numpy.array?
- azure-digital-twins - 如何在 Azure 数字孪生中获取 IoT 中心的连接字符串
- excel - VBA 在我的计算机上工作,但不在其他计算机上会引发错误 438
- r - R 一个操作按钮的闪亮两个输出