【问题标题】:Syncing between Spreadsheets在电子表格之间同步
【发布时间】:2020-10-20 10:24:59
【问题描述】:

目前有一个用于将单元格格式和值同步到另一个电子表格的工作脚本。我知道这是非常粗糙和准备好的,但它有效!我不喜欢 For 循环中有数字来获得正确的单元格编号……但这需要从单行 9 列到目标电子表格,即 9 行 x 1 列。

与同事交谈后,反馈是这会运行得很慢。我已将其重写为 9 If 语句,但问题是拖动单元格时只会更新第一个单元格,而不是范围。

有 copyTo 功能,不幸的是,这只适用于单个电子表格。

整体速度无所谓,有替代方案吗?

// for loop to populate all cells
  for (let i = 21; i < 30; i++){                                              // starts at volumn V (22) for 9 columns (21 to 30)
  var activeCell = registerSheet.getRange(activeRow, i + 1, 1, 1);      // Register column, i + 1 so it increases
  var registerValue = activeCell.getValue();                            // get cell value
  var registerFormat = activeCell.getBackground();                      // get cell format     
  var i2 = 'C' + (33 + i)                                               // this increases the target cell range from C54 to C62 using the loop. 54 (start row on form) - 21 (start i value) = 33
  var range = form.getRange(i2);                                        // designate target cell
  range.setValue(registerValue);                                        // set target cell value
  range.setBackground(registerFormat);                                  // set target cell format 
  }
  }

【问题讨论】:

  • 我的回答对你有用吗?
  • 嗨马里奥斯。是的,它工作得很好。我想谢谢你,但下面的说明说不要回复“谢谢”!。
  • 很高兴它解决了您的问题。您能否通过单击答案左侧的勾选按钮来接受答案?谢谢

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


【解决方案1】:

解释:

  • 您的代码确实效率低下,因为您正在调用setValue()setBackground()9 次,你可以简单地使用 setValues()setBackgrounds() 而不是 一次。如果迭代次数越多,它的效率就会越低。

  • 你需要做一个小技巧,就是将getRange(activeRow,22,1,9).getValues()返回的getRange(activeRow,22,1,9).getValues()形状为(1,9)的数据(9,1)转换为(9,1)的形状,并对背景颜色执行相同的操作好吧:

    var rowValues=registerSheet.getRange(activeRow,22,1,9).getValues().flat().map(r=>[r]); // V:AD
    var rowBackcolors = registerSheet.getRange(activeRow,22,1,9).getBackgrounds().flat().map(r=>[r]); // V:AD
    
  • 之后,您可以简单地将数据直接设置到目标工作表:

    var range = form.getRange('C54:C62'); // C54:C63
    range.setValues(rowValues);
    range.setBackgrounds(rowBackcolors);
    

解决办法:

用这个替换for循环:

var rowValues=registerSheet.getRange(activeRow,22,1,9).getValues().flat().map(r=>[r]); // V:AD
var rowBackcolors = registerSheet.getRange(activeRow,22,1,9).getBackgrounds().flat().map(r=>[r]); // V:AD 
var range = form.getRange('C54:C62'); // C54:C63
range.setValues(rowValues);
range.setBackgrounds(rowBackcolors);

相关文章:

What does the range method getValues() return and setValues() accept?

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2020-05-21
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多