【问题标题】:Google Apps Script - Using a Form Response Value in Locating Cells that are duplicates in the sheet and deletes the rows that matches the ValueGoogle Apps 脚本 - 在查找工作表中重复的单元格时使用表单响应值并删除与该值匹配的行
【发布时间】:2023-01-03 18:20:45
【问题描述】:

我一直在努力寻找一种方法删除使用表单响应定位的行,然后将其与以前提交的表单中充满名称的列进行比较避免电子表格中的重复数据。下面的代码是我到目前为止所拥有的。如果代码没有意义,我深表歉意,因为我试图适应以前给我的代码。它有一个类似的概念,我认为它会以某种方式起作用,但它不起作用。

var formResponses = form.getResponses();
for (var i = 0; i < formResponses.length; i++) {
  var formResponse = formResponses[i];
  var itemResponses = formResponse.getItemResponses();
  for (var j = 0; j < itemResponses.length; j++) {
    var itemResponse = itemResponses[1];
    var finalitemResponse = itemResponse.getResponse();
    nameofclient_runningbalance.setValue(finalitemResponse);
    Logger.log(finalitemResponse);
    var values = hospitalSheet.getRange(2, 4, hospitalSheet.getLastRow(), 1).getValues();
    Logger.log(values);
    var { v, cells } = values.reduce((o, r, i) => {
    if (r[4] == finalitemResponse) {
      hospitalSheet.getRangeList(cells).deleteRows(cells.length, cells[0].length);
      o.cells.push(`R${i + 2}`);
    }
    return o;
  }, { v: [], cells: [] });
  if (v.length == 0) return;
}
}

类似于验证,其中删除使用给定名称的表单响应定位的行,并与充满名称的列进行比较。还有其他方法可以通过它,但我想知道是否有一种方法可以通过我现在使用的方法来获得额外的知识。

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    我相信你的目标如下。

    • itemResponses[1] 的响应值与hospitalSheet 的“D”列相同时,您想删除行。

    修改点:

    • 在您的脚本中,var values = hospitalSheet.getRange(2, 4, hospitalSheet.getLastRow(), 1).getValues(); 中的值是从“D”列中检索的。但是,在values.reduce((o, r, i) =&gt; {,,,}中,使用了r[4] == finalitemResponse。在这种情况下,r[4] 没有元素。并且,在hospitalSheet.getRangeList(cells).deleteRows(cells.length, cells[0].length);,未声明cell

    • nameofclient_runningbalance.setValue(finalitemResponse);,值被放在相同的范围内。

    • 在您的脚本中,我认为当删除过程移到循环外部时,过程成本可能会降低。

    当这些点都体现在你的脚本中时,下面的修改怎么样?

    修改脚本:

    var formResponses = form.getResponses();
    var resValues = [];
    for (var i = 0; i < formResponses.length; i++) {
      var formResponse = formResponses[i];
      var itemResponses = formResponse.getItemResponses();
      for (var j = 0; j < itemResponses.length; j++) {
        var itemResponse = itemResponses[1];
        var finalitemResponse = itemResponse.getResponse();
        resValues.push(finalitemResponse)
        // nameofclient_runningbalance.setValue(finalitemResponse);
      }
    }
    resValues = [...new Set(resValues)];
    var values = hospitalSheet.getRange(2, 4, hospitalSheet.getLastRow(), 1).getValues();
    var rows = values.reduce((ar, [d], i) => {
      if (resValues.includes(d)) {
        ar.push(i + 2);
      }
      return ar;
    }, []).reverse().forEach(e => hospitalSheet.deleteRow(e));
    

    要么,

    var formResponses = form.getResponses();
    var resValues = [];
    for (var i = 0; i < formResponses.length; i++) {
      var formResponse = formResponses[i];
      var itemResponses = formResponse.getItemResponses();
      for (var j = 0; j < itemResponses.length; j++) {
        var itemResponse = itemResponses[1];
        var finalitemResponse = itemResponse.getResponse();
        resValues.push(finalitemResponse)
        // nameofclient_runningbalance.setValue(finalitemResponse);
      }
    }
    resValues = [...new Set(resValues)];
    var range = hospitalSheet.getDataRange();
    var [header, ...values] = range.getValues();
    var newValues = [header, ...values.filter(r => !resValues.includes(r[3]))];
    range.clearContent();
    hospitalSheet.getRange(1, 1, newValues.length, newValues[0].length).setValues(newValues);
    
    • 运行这些脚本时,会从itemResponses[1] 中检索值,并通过从hospitalSheet 的“D”列中搜索检索到的值来删除行。

    笔记:

    • 在此修改中,它假定formhospitalSheet 在别处声明。请注意这一点。

    • 在此修改中,它假定从您的显示脚本中,该值是从hospitalSheet 的“D”列中搜索的。请注意这一点。如果这与您的实际情况不同,您能否提供示例电子表格的图像?借此,我想确认一下。

    • 如果您需要使用nameofclient_runningbalance.setValue(finalitemResponse);,请删除//

    参考:

    【讨论】:

    • 田奈池爵士一如既往的精确。你提到的目标正是我想要解决的问题。稍后我会研究这个并将两者都应用到我的代码中,看看哪个更合适。感谢您的帮助!你的见解总是非常有帮助。
    • 我现在也明白了 reduce 如何更有效地工作,因为我也从你之前的询问中得到了代码。
    • 所以我设法将它放入我的脚本中并最终删除了行,尽管这似乎是一个问题,因为我从表单提交并记录到工作表中的任何内容都会将其删除。我放置了一个触发器来在表单提交时运行代码。
    • 该脚本删除了我通过表单放入电子表格中的所有内容,我很好奇为什么?
    • @Dean 谢谢你的回复。没问题。当您将其作为新问题发布时,我想确认一下。
    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多