我遇到的问题可能是由于我对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行。
答案 0 :(得分:1)
更改此行
var cell = sheet.getRange(input);
到
var cell = sheet.getRange('"' + input + '"');
你应该在传递的值周围加上引号。您应该可以对其他行执行相同的操作。
答案 1 :(得分:1)
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();
来获取单元格的内容。
答案 2 :(得分:1)
感谢大家的努力,我实际上已经成功找到了解决方案。还有比我想象的更多的错误。
首先,我的第一个函数的代码:
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;
}

问题,输入。 当你在这样的表格中调用一个函数时,结果是:
= getCellRGB(Sheet1,A1,A1," r")
A1和B1实际上返回那些单元格的值,而不是对单元格本身的引用。事实上,它似乎没有办法轻松地将单元格引用输入到函数中。我通过像这样输入来解决这个问题:
=getCellRGB(Sheet1 ROW(A1), COL(A1), "r")
哪个更复杂但有效,甚至允许我进行配方粘贴"在表格中。
输入表格 输入要从中获取RGB的单元格所需的工作表是必要的,因为我希望它可以在电子表格中的不同工作表上,而不仅仅是相同的工作表。
< / LI>发出getRange()函数 这个花了一段时间,因为我认为使用它的唯一方法是使用单元格引用作为String - getRange(&#34; A1&#34;)。虽然这是一种方法,但也可以输入行和列,输入有默认的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);
}
&#13;
那里有一些注释掉的调试代码,但除非没有正确触发,否则这种情况有效,因为背景颜色的变化显然不会触发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);
}
&#13;
function setBgColor() {
var s = SpreadsheetApp.getActive().getSheetByName("Calculation");
var targetrange = s.getRange('L2:L').setBackgrounds(s.getRange('K2:K').getValues());
}
&#13;
由于我只需要将其作为一次性功能,因此效果很好,但也可以转换为不同的工作方式。