删除今天日期之前的列
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);
}
我已经为此苦苦挣扎了几个星期。我有 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);
}