【问题标题】:Google Sheets: How to Move Data Between Sheets based on Text and DateGoogle 表格:如何根据文本和日期在表格之间移动数据
【发布时间】:2019-03-04 17:33:52
【问题描述】:

我有三张工作表,我想根据某些条件在它们之间传输数据行。从 sheet1 到 sheet2 基于文本字符串,从 sheet2 到 sheet3 基于今天日期与输入日期之间的差异。但是到目前为止,我的尝试都没有结果。

我想根据“P”列读取为“已完成”还是“已抛出”将数据从 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 部分也不再工作。

【问题讨论】:

  • 您有问题吗?
  • 是的,这是一个问题/帮助请求。更新了标题以使其更清晰。我不知道如何实现我的目标

标签: google-apps-script google-sheets


【解决方案1】:

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

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

我会用这个var data = r.getDataRange().getValues().map(function(x) {return x[15];});替换这个:var data = r.getDataRange().getValues().map(function(x) {return x[16];});

我会将这个 if(["Completed"].indexOf(data[i])>-1) 替换为:if(data[i]=="Completed")

就个人而言,我会颠倒你的循环顺序。您没有删除任何行,即使您是,您仍然可以使用一个额外的变量来跟踪您删除了多少行。

我不建议在 onEdit() 上运行它,因为您会遍历所有行。我将使用事件对象通过eventObject.range.rowStart 确定我在哪一行,并一次处理一行。

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

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);
    }
  }
}

【讨论】:

  • 非常感谢!这解决了我的第一个问题,太棒了。关于如何比较第二部分的两个日期的任何想法?移动它们现在已经设置好了。
  • 我想通了(基于你的一篇旧帖子很有趣)。 stackoverflow.com/questions/47545080/… 所以我想再次感谢你!
  • 很高兴能为您提供帮助。度过一个愉快的夜晚。
猜你喜欢
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多