【问题标题】:Trying to write a list of the named ranges in my Google Sheet to a separate sheet尝试将我的 Google 表格中的命名范围列表写入单独的表格
【发布时间】:2020-03-19 06:14:46
【问题描述】:
我是编码新手。我有一个包含 314 个命名范围变量的 Google 表格。我正在尝试将所有命名范围的垂直列表打印到工作簿中的单独工作表中。我得到的错误令人困惑。上面写着
异常:数据中的行数与范围内的行数不匹配。数据有 1 但范围有 314。(第 47 行,文件“代码”)
这是我的代码。我不确定我错过了什么?
function myFunction() {
//Declaring the Active Sheet
var mySheet = SpreadsheetApp.getActiveSheet();
//Declaring Array
var myArray = SpreadsheetApp.getActiveSpreadsheet().getNamedRanges();
//Clearing a range on the Google Sheet
mySheet.getRange('Named Ranges!A1:A314').clearContent();
//Printing Array to Google Sheet
mySheet.getRange('Named Ranges!A1:A314').setValues([myArray]);
}
【问题讨论】:
标签:
google-apps-script
google-sheets
named-ranges
【解决方案1】:
getNamedRanges() 方法返回范围对象而不是它们的名称,setValues 仅在值的维度对应于范围的维度时才有效
- 要检索名称范围,您需要遍历所有范围对象并使用
getName() 检索每个单个范围的名称
-
[myArray] 将包含 [[range1, range2, ...]] 的内容,这将被解释为嵌套数组,包含多列且只有一行
- 要创建一个包含多列且只有一行的数组,您可以执行以下操作:
var myRanges = SpreadsheetApp.getActiveSpreadsheet().getNamedRanges();
Logger.log(myRanges);
var myArray = [];
for (var i = 0; i< myRanges.length; i++){
myArray[i] = [];
myArray[i].push(myRanges[i].getName());
}
- 鉴于您的工作表
mySheet 始终是活动工作表,您可以在getRange() 中指定不同的工作表名称。而是指定任一
SpreadsheetApp.getActiveSpreadsheet().getRange('Named Ranges!A1:A314')
甚至更好的动态:
var myRangeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Named Ranges');
myRangeSheet.getRange(1,1, myArray.length, 1)
- 由于数据中的行数和列数必须与范围内的行数相匹配,后一种方法允许您动态估计与列表条目数对应的行数,无论是多少的命名范围。
- 在用
setValues 覆盖最终数据之前不必clearContent()
您的代码修改示例:
function myFunction() {
var myRanges = SpreadsheetApp.getActiveSpreadsheet().getNamedRanges();
var myArray = [];
for (var i = 0; i< myRanges.length; i++){
myArray[i] = [];
myArray[i].push(myRanges[i].getName());
}
var myRangeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Named Ranges');
myRangeSheet.getRange(1,1, myArray.length, 1).setValues(myArray);
}