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 Apps Script_Google Sheets - Fatal编程技术网

Google apps script 基于单元格值设置行颜色的格式

Google apps script 基于单元格值设置行颜色的格式,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在尝试改编前一个相关问题中的示例脚本。对于列K中的单元格值为零的行,我希望将该行设置为黄色 以下是我当前的代码: function colorAll() { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 3; var endRow = sheet.getLastRow(); for (var r = startRow; r <= endRow; r++) { colorRow(r);

我正在尝试改编前一个相关问题中的示例脚本。对于列K中的单元格值为零的行,我希望将该行设置为黄色

以下是我当前的代码:

function colorAll() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 3;
  var endRow = sheet.getLastRow();

  for (var r = startRow; r <= endRow; r++) {
    colorRow(r);
  }
}

function colorRow(r){
  var sheet = SpreadsheetApp.getActiveSheet();
  var c = sheet.getLastColumn();
  var dataRange = sheet.getRange(r, 1, 1, c);

  var data = dataRange.getValue();
  var row = data[0];

  if(row[0] === "0"){
    dataRange.setBackground("white");
  }else{
    dataRange.setBackground("yellow");
  }

  SpreadsheetApp.flush(); 
}

function onEdit(event)
{
  var r = event.source.getActiveRange().getRowIndex();
  if (r >= 3) {
    colorRow(r);
  }
}

function onOpen(){
  colorAll();
}
函数colorAll(){
var sheet=SpreadsheetApp.getActiveSheet();
var startRow=3;
var endRow=sheet.getLastRow();
对于(var r=startRow;r=3){
彩色行(r);
}
}
函数onOpen(){
colorAll();
}
我的问题是,我不知道如何引用K列。在上面的链接答案中,脚本的创建者声称,“[h]这里有一个Google应用程序脚本示例,它根据a列中的值更改整行的背景颜色。”首先,最重要的是,我不知道他在哪里引用a列。我认为更改var dataRange=sheet.getRange(r,1,1,c);“至”var dataRange=sheet.getRange(r,11,1,c);“会的,但那只是在我的工作表末尾添加了10个空白列,然后脚本崩溃了。我不明白为什么

其次,但更重要的是,他声称脚本影响整行是不准确的,因为他最初的“var dataRange=sheet.getRange(r,1,1,3);“只对前三列着色-这就是为什么我添加了“var c”并将“3”更改为“c”

此外,当我播放/调试脚本,或从电子表格脚本管理器运行“OneEdit”时,我会从undefined中得到“TypeError:无法读取属性”source“。我可以看到“source”是未定义的-我起初错误地认为它是一个方法-但我也不确定如何解决这个问题

最后,K列并不总是引用列,因为我的意思是在它的左边添加更多的列。我假设每次添加列时我都必须更新脚本,但是第2行中有一个列标题永远不会更改,所以如果有人能帮我设计一些代码,在第2行中查找特定的字符串,那么就得到ccolorRow()函数中使用的列参考,我将不胜感激

我不知道这个脚本的结构是否有效,但理想情况下,我希望我的电子表格是反应式的——我不想在编辑驱动单元后或打开时重新运行这个脚本;它看起来像是应该这样做的(如果没有bug的话),但这是我第一次尝试使用谷歌应用程序脚本,我对任何事情都没有把握


我不擅长编写脚本,但2006年我在研究生院上了一门编程基础/Python课程,之后不久我就花了4年时间使用Excel&Access,经常创建和修改宏。我不能真正从头开始设计,但我理解基本原理和概念,即使我不能翻译所有内容(例如,我不明白我正在使用的“for”语句中的第三个参数“+”是什么意思:“for(var r=startRow;r1.
onEdit
是一个特殊函数,编辑电子表格时会自动调用它。如果手动运行它,它将无法使用所需的参数

2.要在K列为0时更改整行的颜色,您必须对脚本进行简单的修改。请参见下文

function colorRow(r){
  var sheet = SpreadsheetApp.getActiveSheet();
  var c = sheet.getLastColumn();
  var dataRange = sheet.getRange(r, 1, 1, c); 

  var data = dataRange.getValues(); 

  if(data[0][10].toString() == "0"){ //Important because based on the formatting in the spreadsheet, this can be a String or an integer 
    dataRange.setBackground("white");
  }else{
    dataRange.setBackground("yellow");
  }

  SpreadsheetApp.flush(); 
}

1.
onEdit
是编辑电子表格时自动调用的特殊函数。如果手动运行,则所需参数将不可用

2.要在K列为0时更改整行的颜色,您必须对脚本进行简单的修改。请参见下文

function colorRow(r){
  var sheet = SpreadsheetApp.getActiveSheet();
  var c = sheet.getLastColumn();
  var dataRange = sheet.getRange(r, 1, 1, c); 

  var data = dataRange.getValues(); 

  if(data[0][10].toString() == "0"){ //Important because based on the formatting in the spreadsheet, this can be a String or an integer 
    dataRange.setBackground("white");
  }else{
    dataRange.setBackground("yellow");
  }

  SpreadsheetApp.flush(); 
}

我不会重写你已经得到一些帮助的代码,我会试着给你解释你提出的具体问题。我看到你已经有了一些答案,但我把它完全放进去,因为它有助于理解

我的问题是,我不知道如何引用K列。

列A=1,B=2,…K=10

I can't figure out where he's referencing column A.
当您更改.getRange..getRange时,您已经很接近了。getRange会根据()中的参数数量执行不同的操作。如果有4个参数,它就是getRange(行、列、numRows、numColumns)

从行(r)开始,最初是行(3)和列(1)。这是单元格(A3)。范围扩展到1行和(c)列。当c=sheet.getLastColumn()时,这意味着您将范围设置为1行和所有列

当你把这个改成

var dataRange = sheet.getRange(r, 11, 1, c)  // the '11' references column L
您的范围从第(3)行第(1)列开始,为11=L。这将运行到第(3)行第(3)列(getLastColumn())。 如果你超出了范围,这会做一些奇怪的事情。 您可能已将其推入无限for循环,这将导致脚本崩溃

其次,更重要的是,他声称脚本影响整行是不准确的,因为他最初的“var dataRange=sheet.getRange(r,1,1,3);” 只对前三列着色-这就是为什么我添加了“var c”并将“3”更改为“c”

是的,(3)表示范围扩展到3列

"TypeError: Cannot read property "source" from undefined."
这里发生的事情并不直观。您不能从电子表格脚本管理器运行函数OneEdit(事件),因为它需要一个“事件”

  • onEdit是一种特殊的google触发器,在任何编辑电子表格时都会运行
  • 它被传递给激活它的(事件),并且
  • event.source.指事件发生的工作表
  • var r=event.source.getActiveRange().getRowIndex();获取进行编辑的行号,该行将更改其颜色
如果在管理器中运行此程序,则没有可供读取的事件,因此未定义。出于同样的原因,您也无法对其进行调试

最后,正如我想说的,K列并不总是参考列 在左侧添加更多列。我想我必须更新 每次我添加列时都使用脚本,但行中有一个列标题 这永远不会改变,所以如果有人能帮我设计一点 将查找说明符的代码
=ArrayFormula(K:K) 
function findSearchColumn () {
  var colNo;  // This is what we are looking for.
  var sheet = SpreadsheetApp.getActiveSheet();
  var c = sheet.getLastColumn();

  // gets the values form the 2nd row in array format
  var values = sheet.getRange(2, 1, 1, c).getValues();
  // Returns a two-dimensional array of values, indexed by row, then by column.

  // we are going to search through values[0][col] as there is only one row
  for (var col = 0; col < data[0].length; col++) { // data[0].length should = c
    if (data[0][col] == value) {
      colNo = col;
      break; // we don't need to do any more here.
    }
  }
  return(colNo);
}
for (var r = startRow; r <= endRow; r++)