在 Google 表格中标记为绿色后的 15 分钟内删除具有绿色背景的行
Delete a row if it has green background in 15 minutes after it has been marked green in Google Sheets
我正在尝试编写一个 google 工作表脚本来删除具有绿色背景的行。
更详细的解释:
我有 google 张 table 其中:
- 第一行代表列的名称 (3)
- 以下所有行代表一些 3 列数据
我需要做的事情:
当电子表格中的任何行(第一行除外)更改为绿色背景时,setTimeout
函数应该启动,最终将删除绿色行的所有数据并将其设置为背景又变白了。
到目前为止我做了什么:
我有一个函数应该 return 范围背景颜色的十六进制值:
function getHexValue(range) {
return SpreadsheetApp.getActiveSheet().getRange(range).getBackground();
}
我有一个函数 returns 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)));
}
但是,我不断收到 'Invalid coordinates or range size' 异常,因此无法继续。此外,google 提示我在循环中使用 getRange
函数不是一个好主意,并且会显着减慢脚本执行速度。
我如何以正确的方式处理我的任务?
这是找到绿色的方法。通常,我喜欢一次获取所有数据。这就是我经常使用 getDataRange() 的原因。一旦数据在一个数组中,您就可以快速浏览它。唯一的技巧是输出。请记住,数据位于二维数组中。因此,如果您没有使用整个数组来设置值,则可能必须使用数组本身来帮助您为 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
}
这里可能是一个更完整的解决方案的开始。它有一个电子表格菜单,因此您可以从电子表格中 运行 它并在文本区域中显示行范围,并向您展示如何使用 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();
}
我正在尝试编写一个 google 工作表脚本来删除具有绿色背景的行。
更详细的解释:
我有 google 张 table 其中:
- 第一行代表列的名称 (3)
- 以下所有行代表一些 3 列数据
我需要做的事情:
当电子表格中的任何行(第一行除外)更改为绿色背景时,setTimeout
函数应该启动,最终将删除绿色行的所有数据并将其设置为背景又变白了。
到目前为止我做了什么:
我有一个函数应该 return 范围背景颜色的十六进制值:
function getHexValue(range) {
return SpreadsheetApp.getActiveSheet().getRange(range).getBackground();
}
我有一个函数 returns 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)));
}
但是,我不断收到 'Invalid coordinates or range size' 异常,因此无法继续。此外,google 提示我在循环中使用 getRange
函数不是一个好主意,并且会显着减慢脚本执行速度。
我如何以正确的方式处理我的任务?
这是找到绿色的方法。通常,我喜欢一次获取所有数据。这就是我经常使用 getDataRange() 的原因。一旦数据在一个数组中,您就可以快速浏览它。唯一的技巧是输出。请记住,数据位于二维数组中。因此,如果您没有使用整个数组来设置值,则可能必须使用数组本身来帮助您为 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
}
这里可能是一个更完整的解决方案的开始。它有一个电子表格菜单,因此您可以从电子表格中 运行 它并在文本区域中显示行范围,并向您展示如何使用 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();
}