繁体   English   中英

表格的Google Apps脚本自定义功能-找不到范围

[英]Google Apps Script custom function for sheets - range not found

我有一个问题,可能是由于我对getRange()函数的工作方式缺乏了解。

我写了两个小的函数在Google表格中使用,但无法获取单元格引用作为输入正常工作。 这是代码:

function getCellRGB(input, color) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];

  var cell = sheet.getRange(input);
  var hex = cell.getBackground();
  hex = hex.replace('#','');

  if (color == "r") return parseInt(hex.substring(0,2), 16);
  else if (color == "g") return parseInt(hex.substring(2,4), 16);
  else if (color == "b") return parseInt(hex.substring(4,6), 16);
  else return null;

}

仅当我这样输入时才有效:

getCellRGB("A1", "r")

如果我尝试使用普通的单元格引用,如在其他函数中使用的那样:

getCellRGB(A1, "r")

我收到错误消息“找不到范围(第6行)”

第二个函数分别从一个单元格中的R,G和B值为一个单元格着色:

function setCellColorFromRGB(red,green,blue) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];

  var r = sheet.getRange(red);
  var g = sheet.getRange(green);
  var b = sheet.getRange(blue);

  cell.setBackgroundRGB(r, g, b)

}

对于这一行,我也得到了同样的错误,也就是第6行。

更改此行

 var cell = sheet.getRange(input);

 var cell = sheet.getRange('"' + input + '"');

并且您应该在传递的值周围加上引号。 您应该能够对其他行执行相同的操作。

getRange()方法接受几种不同类型的参数。 对于一个单元格,您有两种选择:a1表示法中的字符串或从1开始计数的两个整数。

所以:

//these are valid and will get the top left most cell
var cell = sheet.getRange('A1');
var cell = sheet.getRange(1,1);

//this is not valid
var willNotWork = sheet.getRange(A1);

获取单元格后,还需要调用.getValue(); 获取单元格的内容。

感谢大家的努力,我已经设法设法找到解决方案。 错误比我想象的多得多。

首先,我第一个函数的代码:

 function getCellRGB(sheet, row, col, color) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(sheet); var cell = sheet.getRange(row, col); var hex = cell.getBackground(); hex = hex.replace('#',''); if (color == "r") return parseInt(hex.substring(0,2), 16); else if (color == "g") return parseInt(hex.substring(2,4), 16); else if (color == "b") return parseInt(hex.substring(4,6), 16); else return null; } 

  1. 发行,输入。 事实证明,当您像这样在工作表中调用函数时:

    = getCellRGB(Sheet1,A1,A1,“ r”)

A1和B1实际上返回那些单元格的值,而不是对单元格本身的引用。 实际上,似乎没有一种方法可以轻松地将单元格引用输入到函数中。 我通过这样的输入解决了这个问题:

=getCellRGB(Sheet1 ROW(A1), COL(A1), "r")

这比较复杂,但是可以工作,甚至可以让我在表格中“配方粘贴”。

  1. 输入工作表必须输入工作表所在的工作表所在的位置,因为我希望它可以位于电子表格中的不同工作表上,而不仅仅是同一工作表。

  2. 发出getRange()函数由于我认为使用它的唯一方法是将单元格引用作为字符串使用-getRange(“ A1”),所以花了一段时间。 尽管这是一种实现方式,但也可以输入行和列,以输入其中包含默认的ROW()和COL()函数。 那行得通。

因此,此代码有效,并且我已使用它来输出正确的变量,但是问题是,事实证明我实际上是在寻找一个持续运行的脚本,因为应该连续读取和输出RGB值,而不是在输入时一次输出功能。 这使得完全有必要使用不同的代码,这实际上是一个不同的主题,但是由于它可以帮助人们实现相同的实现,因此这里是:

 function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var edit = ss.getSheetByName("Edit"); var calculation = ss.getSheetByName("Calculation"); var listenRange = edit.getRange("M2:M"); var applyRange = calculation.getRange("D2:F"); if (e.source.getSheetName() != "Edit") { //ss.toast('nopeSheet' + ":" + e.source.getSheetName()); return; } var row = e.range.getRow(); if (row < 2) { // ss.toast('nopeRow' + ":" + row); return; } var col = e.range.getColumn(); if (col < 10 || col > 10) { // ss.toast('nopeCol' + ":" + col); return; } var row = e.range.getRow(); var col = e.range.getColumn(); var cell = edit.getRange(row,col); var hex = cell.getBackground(); hex = hex.replace('#',''); var red = parseInt(hex.substring(0,2), 16); var green = parseInt(hex.substring(2,4), 16); var blue = parseInt(hex.substring(4,6), 16); var redCell = calculation.getRange("D" + row); redCell.setValue(red); var greenCell = calculation.getRange("E" + row); greenCell.setValue(green); var blueCell = calculation.getRange("F" + row); blueCell.setValue(blue); } 

那里有一些注释掉的调试代码,但是除此之外它不能正常触发,因为背景颜色的改变显然不会触发onEdit。 致命的缺陷,但还是一个主题,它是另一个问题以及除颜色变化之外的所有内容的主题,它将起作用。

我还对工作表的引用和范围进行了硬编码,但是由于我仅将其专门用于此工作表,所以这应该没有问题。

其次,关于我的另一段原始代码-根据不同单元格中的RGB值设置单元格的背景色。 事实证明这是一个主要问题,因为功能显然不允许基于另一个单元格中的值更改单元格背景色。 我设法通过以下两个功能解决了这个问题:

 function rgbToHex(r,g,b) { var r = parseInt(r); var g = parseInt(g); var b = parseInt(b); if (g !== undefined) return Number(0x1000000 + r*0x10000 + g*0x100 + b).toString(16).substring(1); else return Number(0x1000000 + r[0]*0x10000 + r[1]*0x100 + r[2]).toString(16).substring(1); } 
来源: 如何在JavaScript中将小数转换为十六进制?

 function setBgColor() { var s = SpreadsheetApp.getActive().getSheetByName("Calculation"); var targetrange = s.getRange('L2:L').setBackgrounds(s.getRange('K2:K').getValues()); } 
来源: https//productforums.google.com/forum/#!topic / docs / 88lWZY7WDZI

由于我只需要将此功能用作一次性功能,因此效果很好,但也可以转换为其他功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM