繁体   English   中英

Google 表格应用程序脚本编辑受保护的单元格或 Object 错误

[英]Google Sheets App Script Edit Protected Cell or Object Error

我有一个谷歌表格脚本,我在过去 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 部分允许它成功完成,所以我尝试创建一个主 function 调用 CopyErAdd 脚本(无清除部分),然后调用 ErADD 脚本,我遇到了同样的错误。 两个脚本都可以单独成功运行,但是当组合擦除部分时会遇到错误。

是否有人看到我遗漏的任何问题,或者在过去几周是否发生了我不知道的可能导致此保护错误的事情?

我很欣赏任何人可能有的任何想法。

编辑- 感谢 MetaMan 提供的使脚本更高效的提示。

至于保护,“传入”和“传出”复制目标表是完全打开的,根本没有保护。 除了用户编辑并在脚本中引用的某些单元格外,“加法器”工作表受到保护。 E2:E5(实际上是 E2:I5 打开,因为宏按钮位于 F2:I5 范围的顶部)、B7:B20、E7:I20、L7:L20、B24:B29、J24:J29,全部不受保护。

添加行

SpreadsheetApp.flush()

在代码的复制部分和清除部分之间工作(如更新的代码片段所示)。 我不再遇到范围保护错误。

我真的很感激这个修复,但我很困惑为什么直到最近我才需要这条线。 我猜你不需要 flush() 直到你这样做。

你可以替换这个:

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

如果您在此 function 之后立即使用数据执行任何操作,那么您可能希望添加SpreadsheetApp.flush()

我无法评论保护,因为没有提供任何信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM