【问题标题】:How to Reference Cells in Google Apps Scripts如何在 Google Apps 脚本中引用单元格
【发布时间】:2018-04-18 18:49:16
【问题描述】:

我正在从了解 VBA 过渡到电子表格管理脚本。我创建了一个函数来标记电子表格中包含某些单词的单元格。

如何引用与整个代码相关的特定单元格:

问题在于以下未定义。

setBackgroundColor("#99CC99")

这样合适吗?:

值[i][0].setBackgroundColor("#99CC99")

代码如下:

function foo(){
  var range = SpreadsheetApp.openById("1oh5wXFi4YM1bDvfF27pu1qHDKQEhn02drtfsrRgxArQ").getSheetByName("General").getRange("D:D");
var values = range.getValues();
for(var i in values){
  if(values[i][0].match("Rensselaer")!=null){
     setBackgroundColor("#99CC99")
  } 
  if(values[i][0].match("Albany")!=null){
     setBackgroundColor("#99CC99")
  }
  if(values[i][0].match("Saratoga")!=null){
     setBackgroundColor("#99CC99")
  }
}
}

【问题讨论】:

  • 就像您使用的 VBA 代码一样,有一个 Spreadsheet 类、一个 Sheet 类和一个 Range 类。还有原生语言结构,例如 VB 的 Array(和 Apps Script 的 JavaScript Array)。确保您阅读了 Apps 脚本方法文档,并可能通过一些 Javascript 教程进行操作。使用编辑器的自动完成功能将极大地帮助您了解正在发生的事情以及您的变量是什么类。注意for(var ... in someArray) 不是a recommended practice
  • 您做正确的事 - 处理 Range 值的数组 - 而不是通过 getCell 或类似方法重复调用接口来检查值。要引用值为 values[r][c] 的单元格,请注意 Javascript 数组是 0-base 并且 Range 是 1-base 索引的。所以 A1 = [0][0]。 developers.google.com/apps-script/reference/spreadsheet/…

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


【解决方案1】:

setBackgroundColor(color) 是类 Range 的一个方法,换句话说,首先你应该得到一个范围对象,然后你可以为那个对象调用 setBackgroundColor(color)

values[i][0] 不是引用范围的合适方式,因为此变量保存的是单元格内容而不是单元格本身。

有几种方法可以引用范围。基本形式是 A1 Notation,以及行号和列号。

一个非常简单的例子

function example1(){
  var range = SpreadsheetApp.getActiveRange();
  range.setBackgroundColor('red');
}

最近引入了类 RangeList,因此现在可以加快算法以编辑非相邻单元格。

function example2() {
  var sheet = SpreadsheetApp.getActiveSheet()
  var redList = [];
  var vls = sheet.getRange('A1:A' + sheet.getLastRow()).getValues();
  for(var i = 0; i < vls.length; i++){
    if(vls[i][0]=== 'red') redList.push('A'+ (i + 1));
  }
  var redRangeList = sheet.getRangeList(redList).setBackground('red');
}

请注意,for 循环不会调用 Google Apps 脚本类和方法,它使用纯 JavaScript,这使其比其他替代方法更快。然后通过一次调用设置几个不相邻单元格的颜色。

【讨论】:

  • 善用闪亮的新技术+1
【解决方案2】:

您可能想这样尝试:

  function foo(){
  var ss=SpreadsheetApp.openById('1oh5wXFi4YM1bDvfF27pu1qHDKQEhn02drtfsrRgxArQ');
  //var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('General');
  //var sh=ss.getActiveSheet();
  var range=sh.getRange(1,4,sh.getLastRow(),1);
  var values=range.getValues();
  for(var i=0;i<values.length;i++){
    if(values[i][0].match(/Rensselaer|Albany|Saratoga/)){
      sh.getRange(i+1,4).setBackgroundColor("#99CC99");
    } 
  }
}

这也有效:

function foo(){
  var ss=SpreadsheetApp.openById('1oh5wXFi4YM1bDvfF27pu1qHDKQEhn02drtfsrRgxArQ');
  //var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('General');
  //var sh=ss.getActiveSheet();
  var range=sh.getRange(1,4,sh.getLastRow(),1);//gets the smallest range that has data in it
  var values=range.getValues();
  var colors=range.getBackgrounds();//Creates the correct size area with the starting colors
  for(var i=0;i<values.length;i++){
    if(values[i][0].match(/Rensselaer|Albany|Saratoga/)){//you can add more alternatives easily
      colors[i][0]='#99cc99';
      //sh.getRange(i+1,4).setBackgroundColor("#99CC99");
    } 
  }
  range.setBackgrounds(colors);
}

有问题吗?

尝试阅读the Google Apps Script Documentation

【讨论】:

  • 第二种方法是最好的方法+1
猜你喜欢
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多