【问题标题】:Google Sheets App Script Edit Protected Cell or Object Error谷歌表格应用程序脚本编辑受保护的单元格或对象错误
【发布时间】: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


    【解决方案1】:

    你可以替换这个:

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

    由于没有提供任何信息,因此我无法对保护发表评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2012-10-28
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多