Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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
Google apps script Google脚本根据数据更改更改行颜色,表格排序_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script Google脚本根据数据更改更改行颜色,表格排序

Google apps script Google脚本根据数据更改更改行颜色,表格排序,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一张按E列排序的表。E列中的值可以重复,这意味着几行可以在E列中具有相同的值。 现在我想给表示E列中的更改的行上色。 以下是我根据StackOverflow的一些重要答案构建的代码: function quicktest() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); var rangeData = spreadsheet.getDataRange().getV

我有一张按E列排序的表。E列中的值可以重复,这意味着几行可以在E列中具有相同的值。 现在我想给表示E列中的更改的行上色。 以下是我根据StackOverflow的一些重要答案构建的代码:

function quicktest() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var rangeData = spreadsheet.getDataRange().getValues();
  var lastRow = spreadsheet.getLastRow();
  //  var searchRange = spreadsheet.getRange(1, 1, lastRow-1, 5);
//  var rangeValues = searchRange.getValues();
  var previousclient = rangeData[2][5];
  console.log(previousclient);
  for ( j = 1 ; j < lastRow - 1; j++){
    var currentclient = rangeData[j][5];
    console.log(previousclient," ",currentclient);
    if (previousclient != currentclient) {
      spreadsheet.getRange(j,1,1,5).setBackground("#cc4125");
      previousclient = currentclient;  
    }; 
}
函数快速测试(){
var电子表格=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var rangeData=spreadsheet.getDataRange().getValues();
var lastRow=spreadsheet.getLastRow();
//var searchRange=spreadsheet.getRange(1,1,lastRow-1,5);
//var rangeValues=searchRange.getValues();
var previousclient=rangeData[2][5];
console.log(以前的客户端);
对于(j=1;j
代码运行,但结果是它“绘制”了错误的单元格,也没有绘制整行(A到H列),它只绘制了A到C。 我在这里也读过一些建议将值发送到rangeValues的答案,但这对我来说不起作用。这就是为什么它被列为代码中的注释。也许我确实需要使用它。 下面是我希望在运行此代码后演示表的外观:

谢谢

小心索引-数组以[0]开头 相应的混淆会导致代码中出现几个问题:

  • rangeData[2][5]
    表示单元格
    F3
    -不是
    E
    ,如果要检索列
    E
    -它对应于数组索引
    4
    (对于以前的和当前的客户端!)
  • 鉴于初始的
    previousclient
    不允许上色(仅以下一行),您应该将其设置为标题行,因此
    rangeData[0][4]
  • 使用方法
    getRange()
    -行索引以
    1
    开头(与数组元素!!!)不同),因此数组元素
    i
    对应于行
    i+1
要解决这些问题,请按以下方式修改代码:

function change_row_color() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var rangeData = spreadsheet.getDataRange().getValues();
  var lastRow = spreadsheet.getLastRow();
  var previousclient = rangeData[0][4];
  console.log(previousclient);
  for ( j = 1 ; j < lastRow - 1; j++){
    var currentclient = rangeData[j][4];
    console.log(previousclient," ",currentclient);
    if (previousclient != currentclient) {
      spreadsheet.getRange(j+1,1,1,5).setBackground("#cc4125");
      previousclient = currentclient;  
    };
  }}

任何一种方法都会更快,这在很大程度上取决于您的数据大小和重复的数量。

谢谢@ziganotschka!现在就像一个符咒一样有效。但是,这个符咒需要相当长的时间才能实现。关于如何使它运行得更快,有什么想法吗?也许可以使用rangeValues想法,在我的原始代码中设置为注释?
rangeValues
的作用与
rangeData
完全相同(它获取一个范围)唯一的区别是,它只检索您指定的行和列,而不是检索工作表上的全部数据。如果您的工作表包含大量数据,但您的函数只能在其中的一部分上运行,则手动定义范围是有意义的。但我相信您希望在所有数据上运行该函数?您可以做些什么来加快计算速度有一点是在每次迭代中用代码结束时只调用一次的方法来替换
setBackground
。是的。我确实想了解工作表的全部内容。我不确定我是否理解setBackgrounds过程。你能解释一下,或者用这个新想法编辑你的答案吗?我正在考虑使用Cache、 这会有帮助吗?还是我完全放弃了呢?谢谢你编辑了你的答案。这个新代码确实更快,但对于350行的小测试范围来说仍然需要20秒左右。我的实际范围接近10K行,所以在工作日使用这个代码不是一个好主意。问题是我们需要运行这个临时代码,并且不能承担夜间或其他非临时代码mmediate运行。有什么想法吗?缓存?顺便说一句-我正在处理的数组是一个IMPORTRANGE数组。这会延长此代码的运行时间吗?
function change_row_color() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var range = spreadsheet.getDataRange();
  var rangeData = range.getValues();
  var lastRow = spreadsheet.getLastRow();
  var previousclient = rangeData[0][4];
  console.log(previousclient);
  var colors = [[0,0,0,0,0]];
  for ( j = 1 ; j < lastRow; j++){
    var currentclient = rangeData[j][4];
    console.log(previousclient," ",currentclient);
    if (previousclient != currentclient) {
      colors.push(["#cc4125","#cc4125","#cc4125","#cc4125","#cc4125"]);
      previousclient = currentclient;  
    } else{
      colors.push([0,0,0,0,0]);
    }
  }
range.setBackgrounds(colors);
}