1

我有这个脚本,一旦将数据输入谷歌表单,它就会对数据做几件事,但我需要提出诉讼,当两个参赛者的名字完全相同时,它会完全删除前一个条目。

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

是的,代码是一团糟,我确信它可以做得更好,但重要的是我可以删除重复的信息行。编译器不允许我这样做,因为电子表格链接到表单。有没有解决的办法?

4

1 回答 1

1

在接收表单数据的工作表中阻止以下删除尝试:

  • 删除带有表单数据的列
  • 删除带有表单问题的行 - 即第 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”表的内容;如果 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);
    }
  }
}
于 2016-06-16T07:45:53.457 回答