Google表格脚本:基于单元格值格式化行 - 尝试优化脚本

时间:2017-01-26 22:14:21

标签: javascript excel-vba google-sheets vba excel

我有一个脚本会遍历Google表格中特定列的行,然后根据单元格中包含的值格式化整行。问题是这个脚本非常慢,因为我在列范围的每一行上使用getValue,而不是在整个列上使用getValues并像数组一样引用它。

请参阅下面的原始脚本:

function rowLoop() {
  var ss = SpreadsheetApp.openById("Fake_ID");
  var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("Fake Name"));
  var endRow = sheet.getLastRow();
  // <= to repeat for all rows
  for (var r = 1; r <= endRow; r++) {
    rowAlignment(r);
    }
}

function rowAlignment(r) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var c = sheet.getLastColumn();
  var row = sheet.getRange(r, 2, 1, c);
  // Get cell in column E of row
  var typeCell = row.getCell(1,25);
  // Get its value
  var typeData = typeCell.getValue();
  // Test equal to 'Post' with ==
  if(typeData == 'Post') {
     row.setHorizontalAlignment('right').setFontSize('6').setFontStyle('italic').setFontWeight('normal');
  }
  else if (typeData == 'Campaign') {
     row.setFontWeight('bold').setHorizontalAlignment('left').setFontSize('8').setFontStyle('normal');
  }
  SpreadsheetApp.flush();
}

脚本完全符合它的意思,但它的速度很慢。我尝试使用getValues而不是getValue来优化它。这是我到目前为止所写的内容,但问题在于脚本没有做任何事情。它没有弹出任何错误,它似乎没有做任何事情。见下文:

function rowTestLoop() {
  var ss = SpreadsheetApp.openById("Fake_ID");
  var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("Fake_Name"));
  var endRow = sheet.getLastRow();
  var endCol = sheet.getLastColumn();
  var data = sheet.getRange(1,1, endRow, endCol).getValues();
  // <= to repeat for all rows
  for (var r = 1; r <= endRow; r++) {
    var currentRow = sheet.getRange(r, 2, 1, endCol);
    if(data[r][24] == 'Post') {
      currentRow.setHorizontalAlignment('right').setFontSize('6').setFontStyle('italic').setFontWeight('normal');
    }
    else if (data[r][24] == 'Campaign') {
     currentRow.setHorizontalAlignment('left').setFontSize('8').setFontStyle('normal').setFontWeight('bold');
    }
  }
  SpreadsheetApp.flush();
}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

所以我相信我已经弄清楚了。

您正在尝试在第24列中查找标签post和Campaign。 但是,当您将工作表数据提取到一个数组中时,您已考虑到数组索引从&#39; 0&#39;开始的事实。电子表格索引的起始位置为&#39; 1&#39;

  

原始代码:if(data [r] [24] ==&#39; Post&#39;)

     

编辑代码:if(data [r-1] [23] ==&#39; Post&#39;)

所以基本上你需要修改索引以匹配数组而不是电子表格。换句话说,电子表格中的第1行是数组中的元素0,类似于电子表格中的第1行第12列是数组中的元素[0] [11]

function rowTestLoop() {
  var ss = SpreadsheetApp.openById("Fake_ID");
  var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName("Fake_Name"));
  var endRow = sheet.getLastRow();
  var endCol = sheet.getLastColumn();
  var data = sheet.getRange(1,1, endRow, endCol).getValues();
  // <= to repeat for all rows
  for (var r = 1; r <= endRow; r++) {
    var currentRow = sheet.getRange(r, 2, 1, endCol);
    if(data[r-1][23] == 'Post') {
      currentRow.setHorizontalAlignment('right').setFontSize('6').setFontStyle('italic').setFontWeight('normal');
    }
    else if (data[r-1][23] == 'Campaign') {
     currentRow.setHorizontalAlignment('left').setFontSize('8').setFontStyle('normal').setFontWeight('bold');
    }
  }
  SpreadsheetApp.flush();
}