当前位置: 首页 > 知识库问答 >
问题:

Google工作表:如何根据文本和日期在工作表之间移动数据

全冥夜
2023-03-14

我有三个工作表,我想根据特定条件在它们之间传输数据行。根据文本字符串从sheet1到sheet2,以及根据今天的日期与输入日期之间的差异从sheet2到sheet3。然而,到目前为止,我的尝试都是徒劳的。

我想根据列“P”读取为“Completed”还是“抛出”,将数据从sheet1移动到sheet2。我还想在“O”列中记录更改为上述任一选项的日期。

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var c = ss.getSheetByName("Case Logs");
  var r = ss.getSheetByName("Recent Cases");
  var data = c.getDataRange().getValues().map(function(x) {return x[16];});
  var numColumns = c.getLastColumn();
  var current = new Date();


  for (var i= data.length-1; i>=0; i--) {
    if(["Completed"].indexOf(data[i])>-1) {
        var row = i+1;
        var target = r.getRange(r.getLastRow() + 1, 1);
        c.getRange('O').setValue(current);
        c.getRange(row, 1, 1, numColumns).copyTo(target);
        c.getRange(row, 1, 1, numColumns).clearContent();
        c.getRange(row, 1, 1, numColumns).clearNote();
     }
    if(["Thrown Out"].indexOf(data[i])>-1) {
        var row = i+1;
        var target = r.getRange(r.getLastRow() + 1, 1);
        c.getRange('O').setValue(current);
        c.getRange(row, 1, 1, numColumns).copyTo(target);
        c.getRange(row, 1, 1, numColumns).clearContent();
        c.getRange(row, 1, 1, numColumns).clearNote();
    }
  }
}

对于第二种情况,我想根据列“O”中列出的日期是否大于或等于与当前日期的四个月差异将行从Sheet2移动到Sheet3。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var r = ss.getSheetByName("Recent Cases");
  var a = ss.getSheetByName("Archived Cases");
  var data = r.getDataRange().getValues().map(function(x) {return x[16];});
  var numColumns = r.getLastColumn();
  var TIME_FRAME = 1000 * 60 * 60 * 24 * 120;
  var now = new Date();
  var past = new Date(now.getTime() - TIME_FRAME);

  for (var i= data.length-1; i>=0; i--) {
    if (["**Column DATE**"].indexOf(logs[i])>-1 >= past){
      var row = i+1;
      var target2 = a.getRange(a.getLastRow() + 1, 1);
      r.getRange(row, 1, 1, numColumns).copyTo(target2);
      r.getRange(row, 1, 1, numColumns).clearContent();
      r.getRange(row, 1, 1, numColumns).clearNote();
    }
  }
}

虽然因为我真的在抨击任何看似可行的编程,整个事情都是一团糟。我不知道如何引用列中的特定单元格并确认它是否是日期,在我尝试让第一个onEdit部分输入日期后,它也不再工作。

共有1个答案

许俊风
2023-03-14

以下是对第一个函数的几点建议:

列P是16,但数组从零开始,列从一开始。

我将替换这个:var data=r.getDataRange()。getValues()。map(函数(x){返回x[16];}) 使用此变量data=r.getDataRange()。getValues()。map(函数(x){返回x[15];})

如果([“Completed”]。indexOf(data[I]),我将替换此

就我个人而言,我会颠倒你的循环顺序。您没有删除任何行,即使是,也可以通过一个额外的变量跟踪删除的行数。

我不建议在onEdit()上运行此命令,因为您将遍历所有行。我将使用event对象通过eventObject确定我所在的行。范围行开始,一次处理一行。

  • 事件对象

如果您希望将数据从一个工作表移动到另一个工作表并删除旧行,您可以执行以下操作:

function moveAndDeleteRows() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet85');
  var tsh=ss.getSheetByName('Sheet86');
  var rg=sh.getDataRange();
  var n=0;
  var lc=sh.getLastColumn();
  var vA=rg.getValues().map(function(r){return r[15]});//this is equivalent to your get column P
  for(var i=0;i<vA.length;i++) {
    if(vA[i]=='Complete' || vA[i]=='Thrown Out') {
      sh.getRange(i-n+1,1,1,lc).moveTo(tsh.getRange(tsh.getLastRow()+1,1));
      sh.deleteRow(i-n+1);
      n+=1;
    }
  }
}

这是我在onEdit()中使用的函数,它执行类似的过程。我将数据验证放在“完成”或“抛出”的P列中进行设置。因此,无论何时选择一个,它都会移动到另一个工作表,并删除您所在的行。

function moveData(e) {
  if(e.range.getSheet().getName()!='Case Logs') {return;}
  var tsh=e.source.getSheetByName('Recent Cases');
  if(e.range.columnStart==16) {
    if(e.value=='Completed' || e.value=='Thrown Out') {
      e.range.getSheet().getRange(e.range.rowStart,1,1,e.range.getSheet().getLastColumn()).moveTo(tsh.getRange(tsh.getLastRow()+1,1));
      e.range.getSheet().deleteRow(e.range.rowStart);
    }
  }
}

 类似资料:
  • 有人能帮我把脚本布局转换成实际的功能代码吗?我有一般的编码知识,但我不知道正确的语法。 基本上,我需要的是一个脚本,当提交表单条目时,它会在所有工作表/选项卡之间循环。表单包含提交表单的人的姓名(字符串)、开始日期、结束日期,最后是注释字段(字符串)。 我需要脚本来遍历每个工作表的第5行,并查找在第一个表单字段中输入的字符串(提交表单的人的姓名)。如果它找到了该名称,它应该将与该名称对应的列保存到

  • 我有一个脚本,当数据被添加到列“我”时,它将数据从一个工作表移动到另一个工作表。 我想调整脚本,以执行将所有行(值)从未支付的工作表(其中列I不是空的)通过按钮按钮移动到已支付的工作表,而不是在编辑时。这将允许一次从多行移动数据,而不是使用一次只移动一行的当前脚本。 有人能帮忙吗? 附带说明,脚本的“如果”部分旨在将代码移回原始工作表。这是不需要的,但我无法删除这部分代码并保持功能。

  • 我使用脚本将数据从MySQL数据库导入到工作表中。在导入过程中,其他具有重公式的工作表(vlookup、sumifs、filter)会不断重新计算,因此需要花费很长时间。我想在MySQL数据完全导入后,通过脚本插入公式。 为了简化此过程,我想将工作表上的所有公式(这是一个很长的工作表)提取到一个文件中,并将提取的数据格式化为以下方式:示例:从工作表“摘要”中提取数据: 循环检查工作表中的每个单元格

  • 我正在尝试创建一个简单的发货处理流,并希望使用onEdit复选框触发器在两个工作表(选项卡)之间移动行。 以下是我的项目链接:https://docs.google.com/spreadsheets/d/1SPO21kAyNX5fEqwkXVjmPASkfHvZ5Tzbq4s7e22VdYg/edit#gid=2005756436 基本概念是,由多个工件组成的装运将输入第一张表中,然后复制到WB\

  • 我有两张单子每天和每月有8个Cols,我有一个仪表盘。当我对仪表板使用查询函数时,Col1和Col5中的datetime不是很好地显示出来,因为时间只显示00:00:00。请帮助我附上的表格链接,以供参考,请随意复制和使用。 链接- https://docs.google.com/spreadsheets/d/1mswnoq2dh61his5tyg9vwsxkfiptoqxhs6stiqmeqni