如果在Google表格中将其标记为绿色后15分钟内有绿色背景,请删除该行

时间:2017-08-28 16:50:43

标签: javascript google-apps-script google-sheets google-sheets-api

我试图编写一个google工作表脚本,删除具有绿色背景的行。

更详细的说明:

我有一张google sheet表格,其中包含:

  • 第一行表示列(3)的名称
  • 以下所有行代表一些3列数据

我需要做什么:

当电子表格中的任何行(第一个除外)更改为绿色背景时,应启动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函数不是一个好主意,可能会大大减慢脚本执行速度。

如何以正确的方式处理我的任务?

1 个答案:

答案 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();
}