首页 > 解决方案 > 范围宽度不正确(为 1 但应为 2)

问题描述

我不断收到“不正确的范围宽度是 1 但应该是 2”错误,我不知道为什么。这段完全相同的代码在同一个项目的同一个工作表上的另一个脚本上工作,没有问题。

widthApplied2记录器按预期输出“2.0” 。

即使我手动将“宽度”(numColumns)列为“2”,它也不起作用。使用变量numColumns并且widthApplied2不起作用。有任何想法吗?

var arrayApplied = listApplied.split(',');
var arrayApplied2 = [];
while (arrayApplied.length)
    arrayApplied2.push(arrayApplied.splice(0,2));
var lengthApplied2 = arrayApplied2.length;
var widthApplied2 = arrayApplied2[0].length;
//Logger.log(arrayApplied2);
//Logger.log(lengthApplied2);
Logger.log(widthApplied2);

//PASTE APPLIED TEAMS TO SHEET
var startRow = 15;
var startColumn = 7;
var numRows = lengthApplied2;
var numColumns = widthApplied2;

var ss = SpreadsheetApp.openById('1tyW1n-wBZVygFSovF3Z3NrlqDjsANzOyL7aIayTCdFQ');
var sheet = ss.getSheetByName('test');
var range = sheet.getRange(startRow, startColumn, lengthApplied2, widthApplied2);//dynamically changes range size based on array size

range.setValues(arrayApplied2);

标签: google-apps-scriptgoogle-sheets

解决方案


setValues需要一个矩形二维数组——一个数组,其元素本身就是要设置的值的数组,并且具有相同的长度。您在此处的代码没有显示是什么listApplied,但使用split暗示它是一个以逗号分隔的值字符串。

因此,arrayApplied是 a String[]Array其元素是Strings)。带有 2 个参数的Array#splice方法返回一个Array带有修改内容的新方法。这将是另一个String[]长度为 2 的。例如:

var a = 'Hello,There,Friend';
var aArr = a.split(','); // ['Hello', 'There', 'Friend']
var b = aArr.splice(0, 2); // b = ['Hello', 'There'] & aArr = ['Friend']

如果我们aArr通过拼接到某个目标数组来耗尽,我们最终会得到

var c = [
  ['Hello', 'There'],
  ['Friend']
];

这确实是一个二维数组,但它不是矩形 - 其中一个元素的长度为 1,而其余元素的长度为 2。

对于这种情况,坏元素只能是最后一个。一般来说,也许还有其他一些操作可以确定行的元素(而不是.splice(0, 2)),因此可以使用以下内容确定坏元素(并在适当时填充它):

function fixer_(input) {
  const maxLen = input.reduce(function (curMax, row) { return Math.max(curMax, row.length); }, 0);
  input.forEach(function (row, index) {
    if (row.length < maxLen) {
      console.log('Row index ' + index + ' was too short. Padding it with ""');
      row.push('');
    }
  });
}

推荐阅读