【问题标题】:How do you use a script to delete a row off of a spreadsheet that is linked to a form?如何使用脚本从链接到表单的电子表格中删除一行?
【发布时间】:2016-06-15 21:05:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript google-apps-script google-forms google-sheets-api


    【解决方案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&gt;-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);
        }
      }
    }
    

    【讨论】:

    • 当我去删除行时,该函数编译得很好,但是当它实际运行时它会遇到这个错误:Cannot delete row with form questions. Consider hiding the row instead. (line 23, file "Code") 所以我实际上不能使用 deleteRow 函数。
    • “带表格问题的行”是工作表的第一行。这是唯一不能删除的行。请参阅我对答案的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多