如何使用脚本从链接到表单的电子表格中删除一行?

How do you use a script to delete a row off of a spreadsheet that is linked to a form?

我有这个脚本,一旦将数据输入 google 表单,它就会对数据执行几项操作,但我需要提出诉讼,当两个参赛者的名字完全相同时,它会完全删除前一个条目.

function formChanger() {
  var doc = DocumentApp.openById('THIS WAS MY ID');
  var body = doc.getBody();
  var date = body.getListItems();
  var dates = [];
  for(var i = 0; i<date.length;i++)
  {
    dates.push(date[i].getText());
  }
  var form = FormApp.openById('THIS WAS MY ID');
  var items = form.getItems();
  var ss = SpreadsheetApp.openById("THIS WAS MY ID");
  Logger.log(ss.getName());
  var sheet = ss.getSheets()[0];
  var values = sheet.getSheetValues(2, 4, sheet.getLastRow() , 1);
  Logger.log(values);
  var names = sheet.getSheetValues(2, 2, sheet.getLastRow(), 1);
  var item = items[2].asMultipleChoiceItem();
  var choices = item.getChoices()
  for(var i=names.length; i>-1; i--){
    for(var j=names.length; j>-1; j--){
      if(names[i]==names[j] && i != j)
        sheet.deleteRow(i);
    }
  }
  var h = -1;
  var j = -1;
  var k = -1;
  var l = -1;
  for(var o = 0; o<values.length; o++){        
    if(choices[0].getValue().equals(values[o].toString()))
      h++;
    if(choices[1].getValue().equals(values[o].toString()))
      j++;
    if(choices[2].getValue().equals(values[o].toString()))
      k++;
    if(choices[3].getValue().equals(values[o].toString()))
      l++;
  }
  if(h>3)
    dates.splice(0,1);
  if(j>3)
    dates.splice(1, 1);
  if(k>3)
    dates.splice(2, 1);
  if(l>3)
    dates.splice(3, 1);
  emptyDocument();
  Logger.log(h);
  Logger.log(j);
  Logger.log(k);
  Logger.log(l);
  item.setChoices([
     item.createChoice(dates[0]),
     item.createChoice(dates[1]),
     item.createChoice(dates[2]),
     item.createChoice(dates[3])
 ]);
  for(var i = 0; i<dates.length; i++)
    body.appendListItem(dates[i]);
  Logger.log(doc.getName()+" Contains:");
  Logger.log(dates);
}

是的,代码很乱,我相信可以用更好的方法来完成,但重要的是我可以删除重复的信息行。编译器不允许我这样做,因为 Spread Sheet 链接到表单。有办法解决这个问题吗?

在接收表单数据的 sheet 秒内阻止了以下删除尝试:

  • 删除带有表单数据的列
  • 删除带有表单问题的行 - 即第 1 行

其他行可以随意删除。此行为对于脚本和用户操作完全相同。

您的脚本试图删除第 1 行,因为它有错误。我引用相关部分:

  var names = sheet.getSheetValues(2, 2, sheet.getLastRow(), 1);
  for(var i=names.length; i>-1; i++){
    for(var j=names.length; j>-1; j++){
      if(names[i]==names[j] && i != j)
        sheet.deleteRow(i);

names[i] 在第几行?它位于第 i+2 行,因为 i=0 对应于第 2 行。然而,您尝试删除编号为 i 的行,比预期行高两行。

此外,i>-1; i++是荒谬的;你想要i--那里。


这是一个删除重复行的简单脚本;它已通过我的表单回复进行了测试。它从下往上遍历"Form Responses 1"sheet的内容;如果两行在 C 列中具有相同的值,则较旧的行将被删除。我注意不要尝试删除第 1 行。

(以自下而上的顺序执行此操作的原因是为了避免处理因为其他行被删除而向上移动的行。)

function deleteDupes() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Form Responses 1');
  var values = sheet.getDataRange().getValues();
  for (var i = values.length - 1; i > 1; i--) {
    if (values[i][2] == values[i-1][2]) {
      sheet.deleteRow(i);
    }
  }
}