【问题标题】:Script to delete rows based on a time value in a cell in Google Sheets根据 Google 表格单元格中的时间值删除行的脚本
【发布时间】:2022-01-09 06:16:20
【问题描述】:

我正在尝试编写一个脚本来根据谷歌表格中单元格中包含的时间值删除行,单元格中的值只有上午或下午时间,没有日期。我一直在尝试,但到目前为止我还没有做到。有人可以给我一个指示,说明应该在脚本中定义哪些条件来满足这个条件?此行为背后的目的是仅显示在一小时内发布的帖子。为此,我将每小时自动运行脚本。 :)

数据表:

HOURS MINUTES LATITUDE LONGITUDE ADDRESS POSTED AT BRAND
1 0 28.68062 14/9/1899 20:49:12 Del Paraso 8716, Nuevo Paraso, 31123 Chihuahua, Chih., Mexico 11:53:24 AM ESSO"]
1 0 28.68057 14/9/1899 20:49:08 Del Paraso 8716, Nuevo Paraso, 31123 Chihuahua, Chih., Mexico 1:01:47 PM ESSO"]
1 0 28.68069 14/9/1899 20:49:10 Del Paraso 8716, Nuevo Paraso, 31123 Chihuahua, Chih., Mexico 2:17:48 PM ESSO"]
0 2 28.68061 14/9/1899 20:49:13 Del Paraso 8716, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 5:36:55 PM ESSO"]
0 1 28.68068 14/9/1899 20:49:06 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 5:57:09 PM SHELL"]
1 1 28.68059 -106.13241 Del Paraso 8716, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 9:23:42 PM ESSO"]
2 3 28.68074 -106.13249 Medina 8717, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 1:35:45 PM SHELL"]
2 1 28.68082 -106.13253 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 1:43:11 PM ESSO"]
3 0 28.6805 -106.13283 Siria 2808, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 1:44:49 PM ESSO"]
8 59 28.64719014 -106.0999422 Blvrd Antonio Ortiz Mena 411, Unidad Presidentes, 31210 Chihuahua, Chih. 1:44:49 PM PEMEX
1 0 28.68067 -106.13255 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 5:59:42 PM ESSO"]
1 1 28.68069 -106.13256 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 6:07:49 PM BP"]
2 1 28.68071 -106.13255 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 4:42:28 PM ESSO"]

【问题讨论】:

标签: google-apps-script google-sheets timestamp


【解决方案1】:

此功能将删除所有超过约 2 小时的内容。

function deleteRowBasedUponTime() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("Sheet0");
  const sr = 2;
  const vs = sh.getRange(sr, 1, sh.getLastRow() - sr + 1, sh.getLastColumn()).getDisplayValues();
  Logger.log(JSON.stringify(vs));
  const dtv = Utilities.formatDate(new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate(), new Date().getHours() - 2), ss.getSpreadsheetTimeZone(), "hh:mm:ss a").split(/:| /).reduce((a, v, i, arr) => {
    if (i == 0) a.sum += parseInt(v) * 3600;
    if (i == 1) a.sum += parseInt(v) * 60;
    if (i == 2) a.sum += parseInt(v);
    if (i == 3 && v == "PM" && parseInt(arr[0]) != 12) a.sum += 43200;
    return a;
  }, { sum: 0, total: function () { return this.sum } }).total();
  Logger.log(dtv)
  let k = [];
  vs.forEach((r, i) => {
    let item = r[0];
    let itmv = r[0].split(/:| /).reduce((a, v, i, arr) => {
      if (i == 0) a.sum += parseInt(v) * 3600;
      if (i == 1) a.sum += parseInt(v) * 60;
      if (i == 2) a.sum += parseInt(v);
      if (i == 3 && v == "PM" && parseInt(arr[0]) != 12) a.sum += 43200;
      return a;
    }, { sum: 0, total: function () { return this.sum } }).total();
    if (itmv > dtv) {
      k.push(r)
    }
  });
  if (k && k.length > 0) {
    sh.getRange(sr, 1, sh.getLastRow() - sr + 1, sh.getLastColumn()).clearContent();
    sh.getRange(sr, 1, k.length, k[0].length).setValues(k);
  }
}

基于时间的触发器

function onehourtrigger() {
  //this conditional ensures that you do not create more than one trigger for the same function
  if(ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == "deleteRowBasedUponTime").length == 0) {
    ScriptApp.newTrigger("deleteRowBasedUponTime").timeBased().everyHours(1).create();
  }
}

您可以转到Google Apps Script Reference 并使用搜索框查找您不了解的任何功能。

如果是纯 JavaScript 函数,请转到 here

试试这个方法:

function deleteRowBasedUponTime() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("Diesel");
  const sr = 2;
  const vs = sh.getRange(sr, 1, sh.getLastRow() - sr + 1, sh.getLastColumn()).getDisplayValues();
  Logger.log(JSON.stringify(vs));
  const dtv = Utilities.formatDate(new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate(), new Date().getHours() - 2), ss.getSpreadsheetTimeZone(), "hh:mm:ss a").split(/:| /).reduce((a, v, i, arr) => {
    if (i == 0) a.sum += parseInt(v) * 3600;
    if (i == 1) a.sum += parseInt(v) * 60;
    if (i == 2) a.sum += parseInt(v);
    if (i == 3 && v == "PM" && parseInt(arr[0]) != 12) a.sum += 43200;
    return a;
  }, { sum: 0, total: function () { return this.sum } }).total();
  Logger.log(dtv)
  let k = [];
  vs.forEach((r, i) => {
    let item = r[5];
    let itmv = r[5].split(/:| /).reduce((a, v, i, arr) => {
      if (i == 0) a.sum += parseInt(v) * 3600;
      if (i == 1) a.sum += parseInt(v) * 60;
      if (i == 2) a.sum += parseInt(v);
      if (i == 3 && v == "PM" && parseInt(arr[0]) != 12) a.sum += 43200;
      return a;
    }, { sum: 0, total: function () { return this.sum } }).total();
    if (itmv > dtv) {
      k.push(r)
    }
  });
  if (k && k.length > 0) {
    sh.getRange(sr, 1, sh.getLastRow() - sr + 1, sh.getLastColumn()).clearContent();
    sh.getRange(sr, 1, k.length, k[0].length).setValues(k);
  }
}

我还将格式设置为时间,并遍历列表中的每个项目,将它们更改为更标准化的格式。

这是运行代码后的结果页面:

HOURS MINUTES LATITUDE LONGITUDE ADDRESS POSTED AT BRAND
0 2 28.68061 14/9/1899 20:49:13 Del Paraso 8716, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 5:36:55 PM ESSO"]
0 1 28.68068 14/9/1899 20:49:06 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 5:57:09 PM SHELL"]
1 1 28.68059 -106.13241 Del Paraso 8716, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 9:23:42 PM ESSO"]
1 0 28.68067 -106.13255 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 5:59:42 PM ESSO"]
1 1 28.68069 -106.13256 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 6:07:49 PM BP"]
2 1 28.68071 -106.13255 Del Paraso 8720, Nuevo Paraso, 31123 Chihuahua, Chih., Mxico 4:42:28 PM ESSO"]

【讨论】:

  • 非常感谢您的回复我已经尝试了您的代码,尽管它正在删除电子表格中的所有帖子,即使是那些不到两个小时的帖子,它仍然有效,有什么我需要的吗?应该改变还是我忽略了?此外,在运行脚本时,我收到此错误消息:错误类型错误:无法读取未定义的属性“长度”
  • 我刚刚复制并粘贴到我的编辑器中,并使用我之前拥有的数据运行,它可以工作。
  • 我解决了错误问题。发生这种情况是因为我猜您的列表中没有任何内容通过条件测试。请分享您的数据表
  • 嗨,这是我的桌子的链接:docs.google.com/spreadsheets/d/…
  • 必须将列索引从 0 更改为 5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多