簡體   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