删除今天日期之前的列

Delete columns before today's date

我已经为此苦苦挣扎了几个星期。我有 posted a question here a couple days a go 但我仍然没有得到解决方案。可能是因为实际上这是一个 2-3 项任务的问题,我的错没有很好地解释它。因此,我决定 post 另一个(2-3 个)更简单的任务。

所以,我有下面的脚本,它删除了示例中 sheet 日期早于今天的列。脚本工作正常,但我有两个问题。

首先...如果旧 dates/columns 的数字是一个,它就可以正常工作。它只删除前一天而不是我想保留的前 3 列(示例 sheet 中的 A、B 和 C)。如果它们是一个旧日期,那么脚本会删除今天日期前后的几个 columns/dates。我想要的是只删除今天日期之前的所有 columns/dates,而不是我想保留的前 3 列(示例中的 A、B 和 C sheet)。

第二个问题有点奇怪。目前,我 运行 从自定义菜单(示例 sheet 中的“我的工具”)中选择脚本。现在,当 运行 来自自定义菜单的脚本或使用脚本编辑器中的“运行”按钮时,它可以工作。当我尝试添加一个时间驱动的触发器(不是以编程方式。我不知道如何)所以每 24 小时 运行 它一次,然后我收到一个脚本错误并显示此消息:Exception :在 deleteColumnsDate(代码:14:49).

找不到范围

这是我工作的示例 sheet:https://docs.google.com/spreadsheets/d/1NJvcLxwc96411-Sl_aTu1d-J5gQvqlZjPUQbWZoRqBM/edit?usp=sharing

这是我目前正在使用的脚本:

function onOpen()
    {
      var ui = SpreadsheetApp.getUi();
      ui.createMenu('My Tools')
            .addItem('Delete Older Dates','deleteColumnsDate')
            .addToUi();
    }

  function deleteColumnsDate(row)
    {
      var row = (typeof(row) !== 'undefined') ? row : '3';
      var day = 86400000;
      var today = new Date().getTime();
      var rng = SpreadsheetApp.getActiveSheet().getRange(row + ':' + row);
      var rngA = rng.getValues();
      for(var i = 1; i < rngA[0].length ;i++)
    {
      if(isDate(rngA[0][i]) && (((today - new Date(rngA[0][i]).getTime())/day) > 1 ))
        {
          SpreadsheetApp.getActiveSheet().deleteColumns(i + 1);
        }

      }
    }

    function isDate (x)  
    { 
      return (null != x) && !isNaN(x) && ("undefined" !== typeof x.getDate); 
    }

所以,我在这里做错了什么?。是否可以让此过程每 24 小时 运行 完全自动进行一次?

提前致谢

Nessus

放置时间触发器时,不能使用 getActiveSheet()。相反,您应该使用 SpreadsheetApp.openById( [ID] )

您会在文档的 URL 中找到您的 ID,例如:docs.google.com/spreadsheets/d/abc1234567/编辑#gid=0

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#openbyidid

编辑:

正如库珀提到的那样,我忘记了一些事情。 试试这个方法:

var ss = SpreadsheetApp.openById( [SHEET ID] );
var sh = ss.getSheetByName( [SHEET NAME] ); //delete column here
var rng = sh.getRange(row + ':' + row);

完整功能:

  function deleteColumnsDate() {

    var day = 86400000;
    var today = new Date().getTime();

    var ss = SpreadsheetApp.openById(" [SHEET ID]");
    var sh = ss.getSheetByName(" [SHEET NAME] ");
    var rng = sh.getRange('A1:Z1'); // change if you need larger
    var rngA = rng.getValues();

    var nb_to_delete = 0;
    for(var i = 1; i < rngA[0].length ;i++) { // start colonne B
      if(isDate(rngA[0][i]) && (((today - new Date(rngA[0][i]).getTime())/day) > 1 )){
        nb_to_delete++;
      }
    }
    sh.deleteColumns(2, nb_to_delete);
  }