Search code examples
google-apps-scriptgoogle-forms

Retrieving google form response data


I have a google form, where I need to use item ID and get all the response for that Item.

I have the below script which will timeout if the form has more than 3000 responses, as its inefficient

How Do I optimize it to retrieve all the items in a short span of time

fO.items = ["ItemID1","ItemID2","ItemID3"...];

    for (var i = 0; i < responses.length; i++) {
        var response = responses[i];
        var otherItems = '';
        var flag = true;
        for (var j = 0; j < fO.items.length; j++) {
            var item = form.getItemById(parseInt(fO.items[j]));
            if (response.getResponseForItem(item))
                var otherItems = otherItems + "\t" + response.getResponseForItem(item).getResponse();
            else
                flag = false;
        }
        if (flag) {
            columnData.push(otherItems);
            responseIds.push(response.getId());
        }
    }

Solution

  • Currently, your code is getting the item object with the following line:

    var item = form.getItemById(parseInt(fO.items[j]));
    

    So, that line of code is reading the Form many times. You could try getting the item objects once, putting them into a JSON object, and then retrieving them as needed.

    I haven't tested this code, and I don't know if it will work, or if it will be faster if it does work. But thought I'd share the idea.

    function getSomeAnswers() {
      var form,flag,i,item,itemID,itemList,itemsObject,
          k,L,L_items,otherItems,responses,response,thisAnswer;
    
      itemList = ["ItemID1","ItemID2","ItemID3"];
    
      form = FormApp.getActiveForm();
      responses = FormApp.getActiveForm().getResponses();
    
      itemsObject = {};
    
      L_items = itemList.length;
    
      for (i = 0; i < L; i++) {//Compile a list of item objects
        itemID = parseInt(itemList[i]);
        itemsObject[itemID] = form.getItemById(itemID);
      }
    
      L = responses.length;
    
      for (i = 0; i < L; i++) {
        response = responses[i];
        otherItems = '';
        flag = true;     
    
        for (k in itemsObject) {//Loop through every item to get
    
          item = itemsObject[k];
          thisAnswer = response.getResponseForItem(item);
    
          Logger.log(thisAnswer)
    
          if (thisAnswer)
            otherItems = otherItems + "\t" + response.getResponseForItem(item).getResponse();
          else
            flag = false;
        }
    
        /*
        if (flag) {
          columnData.push(otherItems);
          responseIds.push(response.getId());
        }
        */
      }
    }