在 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 其中:

我需要做的事情:

当电子表格中的任何行(第一行除外)更改为绿色背景时,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();
}