谷歌应用程序脚本-在查找工作表中重复的单元格时使用表单响应值,并删除与该值匹配的行



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

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

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

我相信您的目标如下。

  • itemResponses[1]的响应值与列";D";CCD_ 2

修改点:

  • 在您的脚本中,在var values = hospitalSheet.getRange(2, 4, hospitalSheet.getLastRow(), 1).getValues();,从列"中检索值;D";。但是,在values.reduce((o, r, i) => {,,,}中,使用了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]中检索值,并通过从列"中搜索检索到的值来删除行;D";CCD_ 11

注意:

  • 在这个修改中,它假设formhospitalSheet在其他地方声明。请小心。

  • 在这个修改中,它假设从您的显示脚本中,从列"搜索值;D";CCD_ 14。请小心。如果这与您的实际情况不同,您能以图像的形式提供样本电子表格吗?通过这个,我想确认一下。

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

参考文献:

  • reduce((
  • 筛选器((

最新更新