【问题标题】:Google Sheets Script: Format Row Based on Cell Value - Trying to Optimize ScriptGoogle表格脚本:根据单元格值格式化行 - 尝试优化脚本
【发布时间】:2017-01-26 22:14:21
【问题描述】:

我有一个脚本,它将遍历我的 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();
}

有人可以帮忙吗?

【问题讨论】:

    标签: javascript excel google-sheets vba


    【解决方案1】:

    所以我相信我已经弄明白了。

    您正在尝试在第 24 列中查找标签 post 和 Campaign。 但是,当您将工作表数据提取到数组中时,您已经考虑到数组索引从“0”开始而电子表格索引从“1”开始的事实

    原始代码:if(data[r][24] == 'Post')

    编辑代码:if(data[r-1][23] == 'Post')

    所以基本上你需要修改索引以匹配数组而不是电子表格的索引。换句话说,电子表格中的第 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多