Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 电子表格之间的同步_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 电子表格之间的同步

Javascript 电子表格之间的同步,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,当前有一个工作脚本,用于将单元格格式和值同步到另一个电子表格。我知道这是非常粗糙和准备,但它的工作!!我不喜欢在For循环中有数字来获得正确的单元格编号。。。但这需要从一行9列转到目标电子表格,即9行1列 在与同事交谈后,反馈是这将运行得非常慢。我将其改写为9 If语句,但问题是当在其上拖动单元格时,只会更新第一个单元格,而不会更新范围 有copyTo功能,不幸的是,这只在一个电子表格中起作用 总体速度并不重要,有其他选择吗 // for loop to populate all cells

当前有一个工作脚本,用于将单元格格式和值同步到另一个电子表格。我知道这是非常粗糙和准备,但它的工作!!我不喜欢在For循环中有数字来获得正确的单元格编号。。。但这需要从一行9列转到目标电子表格,即9行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 
  }
  }
//用于循环填充所有单元格
for(设i=21;i<30;i++){//从第V卷(22)开始,共9列(21到30)
var activeCell=registerSheet.getRange(activeRow,i+1,1,1);//寄存器列,i+1,使其增大
var registerValue=activeCell.getValue();//获取单元格值
var registerFormat=activeCell.getBackground();//获取单元格格式
var i2='C'+(33+i)//这使用循环将目标单元格范围从C54增加到C62。54(表格上的起始行)-21(起始i值)=33
var range=form.getRange(i2);//指定目标单元格
range.setValue(registerValue);//设置目标单元格值
range.setBackground(registerFormat);//设置目标单元格格式
}
}
说明:
  • 您的代码确实效率低下,因为您正在调用
    setValue()
    setBackground()
    
    setValues()
    setBackgrounds()
    而不是一次。对于更多的迭代,它将变得更加低效

  • 您需要做一个小技巧,那就是将
    getRange(activeRow,22,1,9).getValues()
    返回的
    (nrows,ncolumns)
    数据转换为
    (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);

相关文章:

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