我有很多命名范围的公式引用的电子表格。
电子表格具有与它在定制菜单进口更新后的数据,可以增加在每个范围所需要的数据的长度相关联的脚本。 一旦数据被导入的脚本更新的命名范围是新数据的长度。
这里是导入新的数据,然后更新的命名范围内的代码块:
// add the CSV menu. Might change this to be an automatic update base don date
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var csvMenuEntries = [{name: "Update Data", functionName: "importFromCSV"}];
ss.addMenu("Update", csvMenuEntries);
}
function importFromCSV() {
var file = DriveApp.getFilesByName("double_leads_data.csv");// get the file object
var csvFile = file.next().getBlob().getDataAsString();// get string content
var csvData = Utilities.parseCsv(csvFile);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('DataImport'); // only add data to the tab DataImport to prevent overwriting other parts of the spreadsheet
sheet.getRange(2,1, csvData.length, csvData[0].length).setValues(csvData);// write to sheet in one single step. Start at row 2 (getRange(2... )
SpreadsheetApp.getUi().alert('Data Updated');
//now update the named ranges if they have changed in length
var openEnded = ["business_unit", "channel", "date", "leads", "medium", "region" ];
for(i in openEnded) {
var r = ss.getRangeByName(openEnded[i]);
var rlr = r.getLastRow();
var s = r.getSheet();
var slr = s.getMaxRows();
if(rlr==slr ) continue; // ok as is-skip to next name
var rfr = r.getRow();
var rfc = r.getColumn();
var rnc = r.getNumColumns();
var rnr = slr - rfr + 1;
ss.removeNamedRange(openEnded[i]);
ss.setNamedRange( openEnded[i], s.getRange(rfr, rfc, rnr, rnc ));
}
}
一切运作良好 - 数据导入和指定范围的更新。 然而,在更新后的所有公式引用的命名范围突破并显示#REF
他们前面引用相应的命名范围。
阅读一些文件在这里有一个句子
当你删除一个命名范围,引用此命名范围的任何公式将不再工作。 然而,引用了一个名为范围的保护范围将换出的命名范围的单元值本身,继续工作。
我真的不知道这意味着什么。 如果我使用一个受保护的范围,而不是将它所有的工作? 我试图编辑上面的代码? 我读到getProtections() 在这里所以试图使一个小编辑:
VAR式开口= [ “businessunit2”, “DATE2”, “leads2”, “中2”, “区域2”, “saleschannel2”];
var openEnded = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE)
我真的不希望这个工作,但值得一试。
是否有解决方案吗? 我怎么可以更新脚本中的命名范围不会破坏现有的公式,引用的范围是多少? 将使用getProtections()导致的解决方案或者是说只是一个消遣?