我正在嘗試清理我不再需要的大量命名范圍的電子表格,并留下我仍在使用的少數范圍。所有這些命名范圍都包含選項卡名稱,因為它們源自模板選項卡(名為tmp),其他選項卡從中復制。即使在我從作業表中洗掉所有衍生標簽并只留下tmp 之后,'tmp'!出現在范圍的名稱中,既顯示在命名范圍側邊欄中,也顯示在 getNamedRanges() 中。
當我嘗試有選擇地洗掉消除的命名范圍時,無論我如何指定范圍的名稱,我都會收到錯誤訊息,指出不存在此類命名范圍。基本上,我正在反饋 getNamedRanges() 和 getRange().getSheet().getSheetName() 給我的相同資訊,只是一路上出現亂碼。
該問題在以下測驗片段中被隔離,涉及在選項卡名稱周圍呈現單引號。我嘗試了幾種方法,包括用斜杠轉義單引號,并在代碼中添加了我在targetDoc.removeNamedRange(namedRange)行上得到的錯誤的注釋。
const analyzerDoc = '1pYgcX2dxzHd4cCofy0RFZTzEl36QesiakMGIqCC2QlY'
const openAnalyzerDoc = SpreadsheetApp.openById(analyzerDoc)
function testDeleteNamedRange (){
var docUrl = openAnalyzerDoc.getRangeByName('docUrl').getValue();
var targetDoc = SpreadsheetApp.openByUrl(docUrl);
// var namedRange = 'dyCl_MoodEntries' // The named range "dyCl_MoodEntries" does not exist.
// var namedRange = 'tmp!dyCl_MoodEntries' // The named range "tmp!dyCl_MoodEntries" does not exist.
// var namedRange = "'tmp'!dyCl_MoodEntries" // The named range "'tmp'!dyCl_MoodEntries" does not exist.
// var namedRange = "\'tmp\'!dyCl_MoodEntries" // The named range "'tmp'!dyCl_MoodEntries" does not exist.
targetDoc.removeNamedRange(namedRange);
}
此錯誤妨礙了更長的功能,該功能運行良好,但對于此測驗功能中隔離的部分。
更長的函式獲取要從此作業表中洗掉的范圍的名稱和選項卡: 
這樣做的正確方法是什么?謝謝!
uj5u.com熱心網友回復:
此函式將洗掉其作業表名稱在范圍名稱內的所有命名范圍。
function deleteAllNamedRange() {
const ss = SpreadsheetApp.getActive();
ss.getNamedRanges().filter(r => ~r.getName().indexOf(r.getRange().getSheet().getName())).forEach(r => r.remove());
}
uj5u.com熱心網友回復:
我想我有我自己的問題的答案。測驗它必須等到明天;然后我會編輯這個。
我突然想到 getNamedRanges() 的結果不是一個物件,而是一個陣列。因此,應該可以通過它在該陣列中的位置來指定一個命名范圍,從而通過指定它的名稱來完全避開我面臨的挑戰。
解決方案似乎在于修改我從 getNamedRanges() 的結果中收集名稱和其他資訊的程序。在這里,我依賴于普遍推薦的 forEach。也許有一種方法可以用 forEach 檢索陣列位置;我不知道,但無論如何,我應該能夠通過遍歷 getNamedRanges() 的結果來做到這一點。
然后我可以在同一張表中記錄這些數字,在那里我記錄它們的名稱、范圍,并找到參考它們的公式,并在其中進行選擇以進行洗掉。然后,我應該能夠通過參考那組數字來洗掉選定的范圍,方法是再次回圈遍歷 getNamedRanges() 回傳的陣列,但順序相反。
明天我將修改這篇文章并說明它是否有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/358350.html
