我试图编写一个google工作表脚本,删除具有绿色背景的行。
更详细的说明:
我有一张google sheet表格,其中包含:
我需要做什么:
当电子表格中的任何行(第一个除外)更改为绿色背景时,应启动setTimeout
函数,最终将删除绿色行的所有数据并将其背景设置为再次变白了。
到目前为止我做了什么:
我有一个函数应该返回范围的背景颜色的十六进制值:
function getHexValue(range) {
return SpreadsheetApp.getActiveSheet().getRange(range).getBackground();
}
如果输入的十六进制值为绿色,我有一个返回true
的函数:
function isGreen(color) {
return ["#b6d7a8", "#d9ead3", "#93c47d", "#6aa84f", "#38761d", "#274e13"].some(function(el) { return color === el; });
}
我还尝试循环播放范围并按以下方式检查背景颜色:
var ss = SpreadsheetApp.getActiveSheet();
var range = ss.getRange('A2:C');
var numRows = range.getNumRows();
for (var i = 1; i < numRows; ++i) {
Logger.log(getHexValue(ss.getRange(i, 1)));
}
但是,我一直收到&#39;无效的坐标或范围大小&#39; 例外,因此无法继续前进。此外,谷歌提示我在循环中使用getRange
函数不是一个好主意,可能会大大减慢脚本执行速度。
如何以正确的方式处理我的任务?
答案 0 :(得分:1)
这是你如何找到绿色。通常,我喜欢一次获取所有数据。这就是我使用getDataRange()的原因。一旦数据在数组中,您可以非常快速地通过它。唯一的技巧是输出。请记住,数据是2D数组。因此,如果您没有将所有数组用于setValues,则可能必须使用数组本身来帮助您为setValues()命令设置正确的大小范围。
function findGreenRow()
{
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=sh.getDataRange();
var cA=rg.getBackgrounds();
var gA=[];
var green='#00ff00'
for(var i=1;i<cA.length;i++)
{
if(cA[i][0] == green && cA[i][1] == green && cA[i][2]==green)
{
gA.push(sh.getRange(i+1,1,1,3).getA1Notation());
}
}
Logger.log(gA);
return gA
}
这可能是一个更完整的解决方案的开始。它有一个spreedsheet菜单,因此您可以从电子表格中运行它,它会在文本区域中显示行范围,并显示如何使用withSuccessHandler进行回调。
FindGreenRows.html
<!DOCTYPE html>
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
function findGreen()
{
google.script.run
.withSuccessHandler(dispGreenRanges)
.findGreenRows();
}
function dispGreenRanges(gA)
{
$('#txt1').val(gA.join(','));
}
</script>
</head>
<body>
<div id="div1">
<textarea id="txt1" rows="4" cols="35"></textarea>
<br /><input id="btn0" type="button" value="Find Green" title="Find green rows." onClick="findGreen();" />
</div>
</body>
</html>
Code.gs
function findGreenRows()
{
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var rg=sh.getDataRange();
var cA=rg.getBackgrounds();
var gA=[];
var green='#00ff00';
for(var i=1;i<cA.length;i++)
{
if(cA[i][0] == green && cA[i][1] == green && cA[i][2]==green)
{
gA.push(sh.getRange(i+1,1,1,3).getA1Notation());
}
}
Logger.log(gA);
return gA
}
function showGreenDialog()
{
var ui=HtmlService.createHtmlOutputFromFile('FindGreenRows');
SpreadsheetApp.getUi().showModelessDialog(ui, 'Find Green');
}
function makeGreenMenu()
{
SpreadsheetApp.getUi().createMenu('The Green Menu')
.addItem('Find Green', 'showGreenDialog')
.addToUi();
}