我有一个Google脚本,我在过去的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..。etc第一个脚本的clearContent和setValue部分允许它成功完成,因此我尝试创建一个主函数,该函数调用CopyErAdd脚本(sans清除部分),然后调用ErADD脚本,然后遇到相同的错误。这两个脚本都可以单独运行,但是合并后擦除部分会遇到错误。
有没有人看到我错过的任何问题,或者在过去几个星期里发生了一些我不知道可能导致这个保护错误的事情?
我很感激任何人可能想到的任何想法。
编辑--谢谢MetaMan给出的使脚本更高效的技巧。
至于保护方面,“传入”和“传出”拷贝的目的单完全打开,根本没有任何保护。除了用户编辑并在脚本中引用的某些单元格外,“加法器”工作表是受保护的。E2:E5 (实际上E2:I5打开,因为宏按钮位于F2:I5区域的顶部),B7:B20,E7:I20,L7:L20,B24:B29,J24:J29,都没有保护。
添加行
SpreadsheetApp.flush()在代码的复制部分和清除部分之间工作(如更新的代码段所示)。我不再遇到距离保护错误了。
我真的很感谢你的修正,但是直到最近我才明白为什么我从来不需要这句话。我想你不需要冲水了。
发布于 2021-05-21 17:22:07
你可以替换这个:
sheet.getRange('I7').setValue('kg');
sheet.getRange('I8').setValue('kg');
sheet.getRange('I9').setValue('kg');
sheet.getRange('I10').setValue('kg');
sheet.getRange('I11').setValue('kg');
sheet.getRange('I12').setValue('kg');
sheet.getRange('I13').setValue('kg');
sheet.getRange('I14').setValue('kg');
sheet.getRange('I15').setValue('kg');
sheet.getRange('I16').setValue('kg');
sheet.getRange('I17').setValue('kg');
sheet.getRange('I18').setValue('kg');
sheet.getRange('I19').setValue('kg');
sheet.getRange('I20').setValue('kg');在这方面:
sheet.getRange('I7:I20).setValue('kg');另外,将其替换为:
var ss = sss.getSheetByName('ADDER'); //Entry sheet
var sheet = SpreadsheetApp.getActive().getSheetByName('ADDER');在这方面:
var sheet = sss.getSheetByName('ADDER);如果在此函数之后立即使用数据执行任何操作,则可能希望添加SpreadsheetApp.flush()。
我不能评论保护,因为这些信息都没有提供。
https://stackoverflow.com/questions/67641192
复制相似问题