首页 > 解决方案 > 将所有工作表上的现有添加、删除和移动同一行更改为批处理版本

问题描述

我有一个谷歌表格,作为我们学生数据的中心。我已经制作了用于删除、移动或添加学生的宏,因为它们位于多个选项卡的同一行中。循环现在超时。

我已经对其进行了研究,显然将其更改为批处理会提高效率。我已经尝试过几次改变它,但没有运气。

\ 添加学生代码

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.');



}
}

上面的代码可以工作,只是它现在超时了,因为谷歌表中有多年的数据并且需要更高效,尤其是移动瞳孔代码。

标签: google-apps-script

解决方案


慢下来的是你的ARRAYFORMULA细胞。删除ARRAYFORMULA调用后,insertRowBefore执行时间会从 5 分钟缩短到 30 秒。

(为了那些没有检查链接电子​​表格的读者:这个特定的电子表格有 50 张深,42 列宽,1500 行长,ARRAYFORMULA每张表都有调用。)

在每张工作表在insertRowBefore循环上花费的所有时间里,工作表必须处理计算ARRAYFORMULA。你需要重新考虑这个系统是如何工作的。你能把数据录入和数据报告分开吗?也许有另一个电子表格可以导入这个并进行计算,而这个只存储没有任何嵌入式公式的纯数据。


推荐阅读