如何从FormApp对象中删除所有项目?

3

我最近问了一个关于如何从Google电子表格添加项目到Google表单的问题。这个方法很好用。不过,与其使用FormApp.create(),我将需要使用.openByUrl(),因为ID必须保持不变。问题是,如果我再次运行我的脚本,它会打开现有的表单(很好),然后将更多项目添加到现有的表单中。

这种行为完全合理,但并不是我想要的。所以我想在添加新项目之前先删除所有现有项目。我查阅了Google Form Services的开发者网站,感觉应该有所有需要的组件。不过我还没有完全整理清楚。

我现在正在进行以下操作:

var form = FormApp.openByUrl('https://docs.google.com/forms/d/.../edit');
var items = form.getItems();
for (var i in items) {
    form.deleteItem(i);
}

然而,那会让我遇到超出范围的错误。有人能指点我正确的方向吗?

9个回答

4
function clearForm(){
  var items = form.getItems();
  while(items.length > 0){
    form.deleteItem(items.pop());
  }
}

虽然这么做很简单,但仍然很遗憾。本应该有一个Form类的方法来解决这个问题。 - lasec0203

4
问题出在您对数组的迭代方式上。
尝试使用以下代码:
var form = FormApp.openByUrl('https://docs.google.com/forms/d/.../edit');
var items = form.getItems();
for (var i=0; i<items.length; i++) {
  form.deleteItem(i);
}

1
这仍然会给我错误,如“无法访问索引处的项目:18。项目数:18。”看起来索引出了问题。 - Florian
6
刚遇到了同样的问题。由于删除项后索引会发生变化,我的解决方案是使用form.deleteItem(0) ,它会重复删除第一个对象直到所有对象都被删除(仅对@teatimer的答案进行了编辑以反映这一点)。 - D. Woods

2
我也遇到了同样的问题。这个方法对我有用:
function deleteItems(){
  var form = FormApp.openById('ID');
  var items = form.getItems();
  items.forEach(function(e){form.deleteItem(e)}) 
}

1

从删除最后一个项目开始,重复此步骤直到所有项目都被删除。可以通过反向for循环来完成这个过程:

function deleteAllItems(){
  var form = FormApp.openById(/*put here your form id*/);
  var items = form.getItems();
  var end = items.length - 1;
  for(var i = end ; i >= 0; i--){
    form.deleteItem(i);
  }
}

另一种选择是通过使用0来避免变量索引,这样第一个项目将被删除,无论是使用正常循环还是反向循环。注意:这已经在对另一个答案的评论中提到过了。

1
这对我很有帮助,当我遇到同样的问题时:

for (var i=0; i<items.length; i++) {
    if (items[i] != null){
        form.deleteItem(i);
    }
}

0

 var form = FormApp.openByUrl('https://docs.google.com/forms/.../edit');
  var items = form.getItems();
    while(items.length > 0)
    {
     form.deleteItem(items.pop());
    }

这对我有效。


0

有许多选项可以循环遍历所有表单项并删除每个表单项,其中最简洁的是:

使用Chrome V8运行时

form.getItems().forEach(form.deleteItem)

没有 Chrome V8 运行时

for each (var item in form.getItems()) {
    form.deleteItem(item);
}

0

当您在循环中检查变量=form.getItems()的长度时,会出现一些错误,因为其长度不会改变,循环最终会无限期地进行并抛出错误。 因此,这是我解决问题的方法:

 for(;form.getItems().length>0;)
 {
     form.deleteItem(0);
 } 

0

我遇到了同样的问题。不过,我通过倒序迭代来解决了它。

var form=FormApp.openByUrl('form url here');
var Items=form.getItems();
var len=Items.length;

for (var i=Items.length-1;i>2;i--){ //Delete every item except first three items
form.deleteItem(i)
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接