2017-02-13 58 views
0

我有一个问题,可能是由于我对getRange()函数的工作原理缺乏理解。表格的Google Apps脚本自定义函数 - 范围未找到

我写了两个用于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和在每一个小区d 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

回答

1

改变这一行

var cell = sheet.getRange(input); 

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

你应该在传递的价值附近引用引号。你应该可以为其他线路做同样的事情。

+0

我不太确定我是否正确理解你。您提供的行是唯一需要更改以考虑传递值的引用行吗?在这种情况下,我仍然会遇到同样的错误。还是有其他情况下我需要改变什么? – enenra

+0

这应该照顾第一个功能。无论您使用传递的范围值,您都必须对其他函数执行相同的操作。 –

+0

原来你对如何将输入转换为字符串来使用是正确的,问题在于输入不是第一位的单元格引用!我在下面的答案中解释了它。谢谢! – enenra

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();得到细胞的内容。

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; 
 
    
 
    
 
}

  1. 问题,输入。 原来当在片材调用一个函数,如下所示:

    = getCellRGB(Sheet 1中,A1,A1, “R”)

A1和B1实际上返回这些单元格的值,而不是对单元本身的引用。实际上,它看起来并不像有一种方法可以轻松地将单元格引用输入到函数中。我解决了这个做的输入,像这样:

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

哪个更复杂,但工作原理,甚至可以让我“公式贴”在表格中。

  • 输入片 因此有必要输入片材,其中从位于作为我希望它是可能为它是在不同的片材在单元中取RGB电子表格,而不仅仅是同一张表格。

  • 发出getRange()函数 这个花了一段时间,因为我认为使用它的唯一方法是将单元格引用作为String - 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); 
     
    
     
    }
    来源: How to convert decimal to hex in 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

    因为我只需要这一个一次性功能,这个工作很好,但它可能会被转换为不同的工作以及。

    相关问题