google-apps-script - 将所有工作表上的现有添加、删除和移动同一行更改为批处理版本
问题描述
我有一个谷歌表格,作为我们学生数据的中心。我已经制作了用于删除、移动或添加学生的宏,因为它们位于多个选项卡的同一行中。循环现在超时。
我已经对其进行了研究,显然将其更改为批处理会提高效率。我已经尝试过几次改变它,但没有运气。
\ 添加学生代码
function insertRow() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var row = SpreadsheetApp.getActiveRange().getRow();
for (var i = 0; i < sheets.length; i++) {
sheets[i].insertRowBefore(row);
}
}
\ 删除学生代码
function deleteRow() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var row = SpreadsheetApp.getActiveRange().getRow();
for (var i = 0; i < sheets.length; i++) {
sheets[i].deleteRow(row);
}
}
\ 移动瞳孔代码
function moveRow() {
var ui = SpreadsheetApp.getUi();
var formResponse = ui.prompt('Move Pupil Row', 'Enter the pupils new form', ui.ButtonSet.OK_CANCEL);
var currentResponse = ui.prompt('Move Pupil Row', 'Enter the current row number for this pupil', ui.ButtonSet.OK_CANCEL);
var newResponse = ui.prompt('Move Pupil Row', 'Enter the new row number for this pupil', ui.ButtonSet.OK_CANCEL);
if (newResponse.getSelectedButton() == ui.Button.OK) {
Logger.log('Collected New Form', formResponse.getResponseText());
Logger.log('Collected Current Row', currentResponse.getResponseText());
Logger.log('Collected New Row', newResponse.getResponseText());
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var row = currentResponse.getResponseText()
var newForm = formResponse.getResponseText()
var pupilData = SpreadsheetApp.getActive().getSheetByName('PupilData');
var formCell = pupilData.getRange("A"+row);
formCell.setValue(newForm);
var newRow = newResponse.getResponseText()
var newRowRange = "A"+newRow+":AP"+newRow
if (row < newRow) {
var rowRange = "A"+row+":AP"+row
} else {
row = +row
row = row + 1
var rowRange = "A"+row+":AP"+row
}
for (var i = 0; i < sheets.length; i++) {
sheets[i].insertRowBefore(newRow);
}
for (var i = 0; i < sheets.length; i++) {
sheets[i].getRange(rowRange).moveTo(sheets[i].getRange(newRowRange));
sheets[i].deleteRow(row);
}
var halfTerm1 = SpreadsheetApp.getActive().getSheetByName('HT1');
var halfTerm2 = SpreadsheetApp.getActive().getSheetByName('HT2');
var halfTerm3 = SpreadsheetApp.getActive().getSheetByName('HT3');
var halfTerm4 = SpreadsheetApp.getActive().getSheetByName('HT4');
var halfTerm5 = SpreadsheetApp.getActive().getSheetByName('HT5');
var halfTerm6 = SpreadsheetApp.getActive().getSheetByName('HT6');
var year = SpreadsheetApp.getActive().getSheetByName('Year');
halfTerm1.getRange('C5:AP').clearContent();
halfTerm2.getRange('C5:AP').clearContent();
halfTerm3.getRange('C5:AP').clearContent();
halfTerm4.getRange('C5:AP').clearContent();
halfTerm5.getRange('C5:AP').clearContent();
halfTerm6.getRange('C5:AP').clearContent();
year.getRange('C5:AP').clearContent();
} else if (newResponse.getSelectedButton() == ui.Button.CANCEL) {
Logger.log('The user canceled the dialog.');
} else {
Logger.log('The user closed the dialog.');
}
}
上面的代码可以工作,只是它现在超时了,因为谷歌表中有多年的数据并且需要更高效,尤其是移动瞳孔代码。
解决方案
慢下来的是你的ARRAYFORMULA
细胞。删除ARRAYFORMULA
调用后,insertRowBefore
执行时间会从 5 分钟缩短到 30 秒。
(为了那些没有检查链接电子表格的读者:这个特定的电子表格有 50 张深,42 列宽,1500 行长,ARRAYFORMULA
每张表都有调用。)
在每张工作表在insertRowBefore
循环上花费的所有时间里,工作表必须处理计算ARRAYFORMULA
。你需要重新考虑这个系统是如何工作的。你能把数据录入和数据报告分开吗?也许有另一个电子表格可以导入这个并进行计算,而这个只存储没有任何嵌入式公式的纯数据。
推荐阅读
- swift - 收到“无效的 Sec-WebSocket-Accept 响应”以连接到 Web 套接字
- ios - 不了解导致 StoreKit SKErrors 的原因
- unity3d - Unity:在专用服务器上通过网络进行旋转同步
- firebase - 如何使用 Firebase 云功能从右到左发送电子邮件
- c# - C# 混合两个列表
- python - ValueError: x and y must have same first dimension 抛出异常,但 x 和 y 的类型和长度相同
- django - Django Order_by 不在 FloatField 上工作
- tensorflow - Tensoflow CPU:分配超过系统内存的 10%
- javascript - ErrorAccessDenied 使用 microsoft graph 删除附件
- asp.net-core - NPOI直接将excel导出到前端而不保存在服务器上