【问题标题】:Fill a range (multiple columns) down multiple rows - google-apps-script向下多行填充一个范围(多列) - google-apps-script
【发布时间】:2013-04-17 22:24:25
【问题描述】:

我成功地用范围 A1 中的值填充了单个列 (A)...

  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var lastRow = ss.getDataRange().getNumRows();  
  var rngVal = ss.getRange("A1").getValue()
  ss.getRange("A2:A"+lastRow).setValue(rngVal)

然后我以为我在easy-street上,我尝试通过用C1:H1范围内的值填充多列范围来修改/应用到更大的范围......

  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var lastRow = ss.getDataRange().getNumRows();  
  var rngVal = ss.getRange("C1:H1").getValues()
  ss.getRange("C2:H"+lastRow).setValues(rngVal)

显然,这不仅仅是在“Value”这个词的末尾加上一个“S”。

错误内容如下:

范围高度不正确,为 1 但应为 10

(仅供参考:var lastRow = 11)

顺便说一句,如果我使用 Value 而不是 Values,我不会收到任何错误,尽管我最终得到的单元格中充满了仅在范围 C1 中找到的值。

所以我很接近.... 或者很远。其中之一。

帮助???

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    错误消息非常明确...数组的大小必须适合 getValues 和 setValues 的范围。像这样试试 :

    function myFunction() {
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      var lastRow = ss.getLastRow()  
      var rngVal = ss.getRange("C1:H"+lastRow).getValues();// get an array of 10 "rows" and 6 "columns"
      ss.getRange("C2:H"+(lastRow+1)).setValues(rngVal);//write back this array to a range that has the same size. (starting from Row2 it must ends on lastRow+1 to keep the same number of "rows"
    }
    

    此函数会将范围 C1:H last Row 转换为 C2:H lastRow+1,不确定它是否非常有用,但这不是重点 ;-)


    编辑:抱歉,我没有完全理解您的要求...这是一个从 C1:H1 复制以下所有行中的数据的代码

    function myFunction() {
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      var lastRow = ss.getLastRow()  
      var rngVal = ss.getRange("C1:H1").getValues();// get an array of the first row
      var rowData = rngVal[0]
      var newData = []
      for(n=1;n<lastRow;++n){newData.push(rowData)}
      ss.getRange("C2:H"+lastRow).setValues(newData);//write back this array to a range that has the same size. (starting from Row2 it must ends on lastRow+1 to keep the same number of "rows"
    }
    

    EDIT2 关注您的以下评论:

    一句话解释:

    当使用range.getValues() 时,我们得到一个二维数组,这意味着可以表示如下的数组数组:[[data1,data2,data3],[data4,data5,data6]] data1、2 和 3 是第一个数组(索引 0)和数据 4 的值, 5 & 6 是第二个数组(索引 1)的值。所以如果你想获取第一个数组中的值,你必须这样写:value = arrayName[0],这将返回一个一维数组[data1,data2,data3],这就是我用来获取rowData的。

    现在我们需要再次获取一个二维数组,以便能够将新数据写回电子表格中的某个范围。因此我们创建了一个新数组(var newData=[]var newData = new Array() 完全相同),在 for 循环中我们将 rowData 数组添加到这个新数组中......结果将是一个数组数组,这实际上是我们一直在寻找,我们可以在一个 setValues 语句中直接将其写入工作表。

    【讨论】:

    • 我认为他试图做的是用第一行中的值填充第一行下面的所有行。
    • 是的,ScampMichael 是正确的。我正在尝试复制第一个填充 col A 范围的代码示例。我正在尝试对 C:H 的多列范围执行相同的操作。我可以逐列完成此操作,但这只是一种解决方法。
    • ...或者这不是一种解决方法。也许它需要这样构建(??)
    • 或者可能类似于“for (var x=1; x
    【解决方案2】:

    好的,这似乎可以做到......

      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      var lastRow = ss.getLastRow()  
      var rngVal = ss.getRange("C1:H1").getValues()
      for (var x=1; x<=lastRow; x++) {
      ss.getRange("C"+x+":H"+x).setValues(rngVal);
    

    【讨论】:

    • 是的,但你应该避免循环写入工作表......如果你有很多行,它会变得很慢。我在编辑中建议的 cede 在数组级别执行,并使用 setValues 一步回写..
    • 我当然希望将我的编码习惯转向阵列级解决方案,因此感谢您提供该解决方案。我想知道您能否帮助我理解其中的几行:'var rowData = rngVal[0]' 和 'var newData = []' 以及 For 例程的后半部分,'{newData.push(rowData)} '。我可以将其他所有内容拼凑在一起,因此理解这 3 行对我的前进将是无价的。再次感谢!
    • 嗨,我补充了几句解释,希望我清楚:) 如果没有,请不要犹豫再问一次。
    • @Serge insas - 我非常感谢您的解释。很有帮助!只是为了在我的脑海中澄清它,您是说使用 this: "[]" 等同于 using: "new array()" ?所以这只是表示同一件事的两种方式吗?另外,“推”是什么意思?这是“写”的一种说法吗?所以在这种情况下,就像说:使用 rowData (??) 的值写入新数组。我真的很想了解这种关系,因为“推”和“阵列”似乎是在臀部结合在一起的。
    • Push 并不像 write,更像是“add at the end”,因为还有一个名为 unshift 的命令可以用来“add at beginning”。数组不一定容易起初理解但非常有用,值得付出努力:-)您可以查看有关该主题的一些互联网资源......最后,请考虑接受答案。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多