Google Script - Forms - Issues Deleting Page Break

2019-09-18 07:15发布

问题:

I am having an issue with the following code when trying to iterate through the items in a form and delete them to make way for new sections/questions. However, I sometimes get the following error "Invalid data updating form". I have worked around this multiple times now, but it keeps coming back up. My current workaround has been to set the section title to "", which made it available to delete. Previously, I didn't need to do this until today.

My question: What is the best way to iterate through the items in a form and delete them from a starting point and not encounter this error?

Reference:
f = the current active form
f_items = all of the items of the form in an array

function clearForm()
{
    var clearQ = find(f_items, "Select Appointment Date/Time")+1;
    var f_i_len = f.getItems().length-1;
    var clear = clearQ;
    while(clear <= f_i_len && clear >= clearQ)
    {
        var item = f.getItems()[clear];
        Logger.log(item.getTitle() + " | " + item.getType());
        Logger.getLog();
        if(item.getType() == "PAGE_BREAK")
        { item.asPageBreakItem().setTitle(""); }
        f.deleteItem(clear);
        f_i_len = f.getItems().length-1;
        clear++;
    }
}

function find(src, name)
{
    var s_len = src.length;
    for(var iter = 0; iter < s_len; iter++)
    {
        var s = src[iter].getTitle();
        if(s == name)
        { return iter; }
    }
    return -1;
}

回答1:

I found out the issue! It was the clear++ at the end of the loop. With the number of items in the going down with each iteration, the clear++ was causing it to skip over the page break items. Below is my finished code:

function clearForm()
{
    var clearQ = find(f_items, "Select Appointment Date")+1;
    var f_i_len = f.getItems().length-1;
    var clear = clearQ;
    while(clear <= f_i_len && clear >= clearQ)
    {
        var item = f.getItems()[clear];
        if(item.getType() == "PAGE_BREAK")
        { item.asPageBreakItem().setTitle(""); }
        f.deleteItem(clear); //}
        f_i_len = f.getItems().length-1;
    }
}


回答2:

The issue I had with this was that the PageBreakItem I was trying to delete was the destination for a conditional answer earlier in the form.

Below is my code where I needed to delete everything after a certain item, which linked to the sections I needed to delete, so I was able to iterate backwards with a while loop.

function getParentNameItem_(form, form_items){
  //finds the item with conditional navigation to what you want to delete
  var parent_name_item = find_(form_items, "Your Name");

  parent_name_item = parent_name_item.asListItem();

  //clears all choices which breaks the navigation dependency
  //this frees up the items to be deleted
  parent_name_item.setChoices([parent_name_item.createChoice("")]);

  var size = form_items.length - 1;

  //iterates from the end back to the last question I want to keep
  while(form_items[size].getTitle() != "Your Name"){

    //this can take either the item itself or the index as I've done
    form.deleteItem(size);

    size--;
  }

  /*I rebuild the choices for parent_name_item
  later based on information from a spreadsheet 
  which I also use to determine the content of 
  the PageBreakItems I just deleted*/

  return parent_name_item;
}