首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除日期早于过去两天的工作表

删除日期早于过去两天的工作表
EN

Stack Overflow用户
提问于 2022-05-01 17:55:52
回答 3查看 58关注 0票数 0

在谷歌脚本中,我正在尝试创建一个函数,它将查看Google工作表中所有选项卡的名称,并删除满足这些条件的所有工作表: 1)选项卡名称包括日期(确实有日期的工作表名称以其他文本作为前缀-- mm/dd/yyyy格式化日期在字符串中);2)该工作表名中的日期比今天的日期早--减去2天)。

有两个工作表名称,包括日期:“领导评审mm/dd/yyyy”和“领导审查w/note mm/dd/yyyy”。我有一个每天自动运行的脚本来创建这些表,所以我们的目标是自动对旧表进行一次清理,并设置每天自动运行该函数的触发器。

到目前为止,我已经创建了一个数组来捕获每个工作表名("tabNameArray")的名称,并有一个regexp用于匹配出现在工作表名称中的mm/dd/yyyy文本。

我的想法是,这将如何工作-不确定如何完成2和3:

  1. 创建数组
  2. 解析数组-将数组中的每个表名与regexp /dd/yyyy匹配,以使用日期标识单张名称。
  3. 一个循环穿过数组..。如果这个单张名有日期(创建一个新的数组或子数组,只有这些?)似乎没有必要,但有一个想法),从今天()开始,这个日期是>2天,删除那些表格。
代码语言:javascript
运行
复制
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...)

如果有一种比我开始思考的更有效的方法,我将非常感谢对此进行编码的支持。

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2022-05-01 18:51:35

描述

下面的示例将比较包含日期到今天的命名工作表,并指出应该删除哪些工作表。我把删除操作留给OP。

脚本

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

参考

票数 1
EN

Stack Overflow用户

发布于 2022-05-01 19:02:08

我想可能是这样的:

代码语言:javascript
运行
复制
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) });
}
票数 1
EN

Stack Overflow用户

发布于 2022-05-01 20:08:05

删除日期早于两天的工作表

代码语言:javascript
运行
复制
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);
    }
  });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72079149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档