【发布时间】:2021-05-21 17:08:39
【问题描述】:
我有一个 Google Sheets 脚本,我在过去 2 年多的时间里一直在使用该脚本,它可以抓取大量数据并将其转录成一对计数表,然后清除已填充的单元格以创建所述数据块所以这个过程可以重新开始。这用于库存计算系统。直到大约 3 周前,该脚本一直可靠运行,但是当对工作表具有有限访问权限的用户尝试运行该脚本时,我现在遇到了编辑保护错误。脚本中的可编辑单元格/范围引用均未锁定给任何用户,但工作表确实对单元格有保护,我不希望任何人对其进行无意更改。
脚本是:
function CopyErADD() {
var sss=SpreadsheetApp.getActiveSpreadsheet();
var sheet = sss.getSheetByName('ADDER'); //Entry Sheet
var rangeIn = sheet.getRange('B32:N45'); //Range to copy into "Incoming" sheet
var dataIn = rangeIn.getValues();
var ts = sss.getSheetByName('Incoming'); //Tally sheet in
ts.getRange(ts.getLastRow()+1, 1, dataIn.length, dataIn[0].length).setValues(dataIn);
var rangeOut = sheet.getRange('B48:O54'); //Range to copy into "Outgoing" sheet
var dataOut = rangeOut.getValues();
var tss = sss.getSheetByName('Outgoing'); //Tally sheet out
tss.getRange(tss.getLastRow()+1, 1, dataOut.length, dataOut[0].length).setValues(dataOut);
SpreadsheetApp.flush() // NEWLY ADDED PER METAMAN'S SUGGESTION
sheet.getRange('E2:E5').clearContent();
sheet.getRange('B7:B20').clearContent();
sheet.getRange('E7:H20').clearContent();
sheet.getRange('I7:I20').setValue('kg');
sheet.getRange('L7:L20').clearContent();
sheet.getRange('B24:B29').clearContent();
sheet.getRange('J24:J29').clearContent();
}
我还有一个“仅擦除”脚本,它只运行脚本的第二部分(如果数据输入错误),执行得非常好。只有在与脚本的复制/转录部分结合时才会发生保护错误。
function ErADD() {
var sss=SpreadsheetApp.getActiveSpreadsheet();
var sheet = sss.getSheetByName('ADDER');
sheet.getRange('E2:E5').clearContent();
sheet.getRange('B7:B20').clearContent();
sheet.getRange('E7:H20').clearContent();
sheet.getRange('I7:I20').setValue('kg');
sheet.getRange('L7:L20').clearContent();
sheet.getRange('B24:B29').clearContent();
sheet.getRange('J24:J29').clearContent();
}
注释掉 sheet.getRange.... 等第一个脚本的 clearContent 和 setValue 部分允许它成功完成,所以我尝试创建一个调用 CopyErAdd 脚本(无清除部分)的主函数,然后调用ErADD 脚本,我遇到了同样的错误。两个脚本都可以单独运行成功,但是合并后擦除部分会遇到错误。
是否有人发现我遗漏的任何问题,或者在过去几周是否发生了我不知道的可能导致此保护错误的事情?
我很欣赏任何人可能有的任何想法。
编辑 - 感谢 MetaMan 提供的提高脚本效率的提示。
至于保护,“传入”和“传出”复制目标表完全打开,根本没有保护。除了用户编辑并在脚本中引用的某些单元格外,“加法器”工作表受到保护。 E2:E5(实际上是 E2:I5 打开,因为宏按钮位于 F2:I5 范围的顶部)、B7:B20、E7:I20、L7:L20、B24:B29、J24:J29,全部不受保护。
添加行
SpreadsheetApp.flush()
在代码的复制部分和清除部分之间起作用(如更新的代码 sn-p 所示)。我不再遇到范围保护错误。
我真的很感激这个修复,但我很困惑为什么我直到最近才需要这条线。我想在你这样做之前你不需要flush()。
【问题讨论】:
标签: google-apps-script google-sheets