在谷歌脚本中,我正在尝试创建一个函数,它将查看Google工作表中所有选项卡的名称,并删除满足这些条件的所有工作表: 1)选项卡名称包括日期(确实有日期的工作表名称以其他文本作为前缀-- mm/dd/yyyy格式化日期在字符串中);2)该工作表名中的日期比今天的日期早--减去2天)。
有两个工作表名称,包括日期:“领导评审mm/dd/yyyy”和“领导审查w/note mm/dd/yyyy”。我有一个每天自动运行的脚本来创建这些表,所以我们的目标是自动对旧表进行一次清理,并设置每天自动运行该函数的触发器。
到目前为止,我已经创建了一个数组来捕获每个工作表名("tabNameArray")的名称,并有一个regexp用于匹配出现在工作表名称中的mm/dd/yyyy文本。
我的想法是,这将如何工作-不确定如何完成2和3:
function deleteOldReportSheets() {
var sheetNameArray = new Array();
var sheetWithDatesArray = new Array(); //not sure this is necessary
var dateRegex = new RegExp("[0-3]?[0-9]\/[0-3]?[0-9]\/(?:[0-9]{2})?[0-9]{2}"); //for mm/dd/yyyy match, tested successfully on regex101.com
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=0 ; i<sheets.length ; i++) sheetNameArray.push( [ sheets[i].getName() ] ) // populates the sheetNameArray with names of each sheet
(do this: for sheets that have a date that is older than 2 days from today, delete...)
如果有一种比我开始思考的更有效的方法,我将非常感谢对此进行编码的支持。
谢谢你的帮助。
发布于 2022-05-01 18:51:35
描述
下面的示例将比较包含日期到今天的命名工作表,并指出应该删除哪些工作表。我把删除操作留给OP。
脚本
function test() {
try {
let spread = SpreadsheetApp.getActiveSpreadsheet();
let sheets = spread.getSheets();
let dateRegex = new RegExp("[0-3]?[0-9]\/[0-3]?[0-9]\/(?:[0-9]{2})?[0-9]{2}"); //for mm/dd/yyyy match, tested successfully on regex101.com
let today = new Date();
console.log("today = "+Utilities.formatDate(today,"GMT","MM/dd/yyyy"));
today = new Date(today.getFullYear(),today.getMonth(),today.getDate()-2);
for( let i=0; i<sheets.length; i++ ) {
let sheet = sheets[i];
let name = sheet.getName();
console.log("Sheet name = "+name);
let match = name.match(dateRegex);
if( match ) {
match = new Date(match[0]);
if( match.valueOf() <= today.valueOf() ) {
console.log("delete");
}
else {
console.log("keep");
}
}
}
}
catch(err) {
console.log(err);
}
}
Console.log
11:45:16 AM Notice Execution started
11:45:17 AM Info today = 05/01/2022
11:45:17 AM Info Sheet name = Sheet1
11:45:17 AM Info Sheet name = Sheet 04/29/2022
11:45:17 AM Info delete
11:45:17 AM Info Sheet name = Sheet 04/30/2022
11:45:17 AM Info keep
11:45:17 AM Info Sheet name = Sheet 05/01/2022
11:45:17 AM Info keep
11:45:16 AM Notice Execution completed
参考
发布于 2022-05-01 19:02:08
我想可能是这样的:
function myFunction() {
const reg = new RegExp(/\d{2}\/\d{2}\/\d{4}/);
const ss = SpreadsheetApp.getActiveSpreadsheet();
const if_two_days_ago = date =>
new Date(date).valueOf() < new Date().valueOf() - 3600000 * 48;
ss.getSheets()
.filter(s => reg.test(s.getName()))
.filter(s => if_two_days_ago(s.getName().match(reg)))
.forEach(s => { console.log('bye-bye -->', s.getName()); ss.deleteSheet(s) });
}
发布于 2022-05-01 20:08:05
删除日期早于两天的工作表
function delSheets() {
const ss = SpreadsheetApp.getActive();
const dt = new Date();
const dtv = new Date(dt.getFullYear(),dt.getMonth(),dt.getDate() - 2).valueOf();//date threshold value
ss.getSheets().forEach(sh => {
let m = sh.getName().match(/\d{1,2}\/\d{1,2}\/\d{4}/g);//includes a date
if(m && new Date(m[0]).valueOf() < dtv) {
ss.deleteSheet(sh);
}
});
}
https://stackoverflow.com/questions/72079149
复制相似问题