Google应用脚本收到错误"抱歉,此回复已提交."

Cyz*_*far 5 google-sheets google-apps-script google-forms

我一直在努力解决这个问题,现在无法让它发挥作用.基本上,我有一个Google表格和一个Google电子表格.

timestamp         | name  |   email | revenue | Edit Url
2015-2-2 02:22:22 | David |         |         |
2015-2-2 07:22:22 | Paul  |         |         |
2015-2-2 09:22:22 | Olive |         |         |
Run Code Online (Sandbox Code Playgroud)

我想要完成的事情:

  • 根据电子表格中的信息(姓名,电子邮件,收入),我想以编程方式迭代每一行,根据每行中的信息填充表单,然后提交表单,并为每个提交的表单生成一个编辑URL,存储在"编辑URL"列中.

到目前为止,这是我的Google应用脚本:

function myFunction() {
  createSurveyResponses();
}


function createSurveyResponses() {

  // Open a form by ID and add a new text item.
  var form = FormApp.openById('form_id');

  var response = form.createResponse();


  var sheet = SpreadsheetApp.openById('spreadsheet_id');

  var getAct = sheet.getActiveSheet();

  var data = sheet.getDataRange().getValues();
  // Access the text item as a generic item.
  var items = form.getItems();

  var item = items[0];

  var urls = [];
  var resultUrls = [];

 for (var j = 1; j < data.length; j++) {
    var dop = data[j][0]

    if (item.getType() == 'TEXT') {
      var textItem = item.asTextItem();
      var itemResponse = textItem.createResponse(data[j][0]);
      var another = response.withItemResponse(itemResponse);
      response.submit();
    } 
 }

  // get the responses from the spreadsheet 
   var fresponses = form.getResponses();

   for (var i = 0; i < fresponses.length; i++) { 
     var resp = [fresponses[i]];
     urls.push([shortenUrl(fresponses[i].getEditResponseUrl())]);
   }

  var getdata = getAct.getRange(2,5,fresponses.length)
  getdata.setValues(urls);


}

function shortenUrl(longUrl) {
  // google url shortener api key
  var key = "AIzaSyBVG4Q5i1mNI0YAO0XVGZ3suZU8etTvK34";

  var serviceUrl="https://www.googleapis.com/urlshortener/v1/url?key="+key;

  var options={
    muteHttpExceptions:true,
    method:"post",
    contentType: "application/json",
    payload : JSON.stringify({'longUrl': longUrl })
  };

  var response = UrlFetchApp.fetch(serviceUrl, options);

  if(response.getResponseCode() == 200) {
    var content = JSON.parse(response.getContentText());
    if ( (content != null) && (content["id"] != null) )
      return content["id"];
  }

  return longUrl;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行代码时,在第一次迭代(第一行)之后,我收到一个错误Sorry, this response has already been submitted. (line 34, file ""),即我在提交响应时response.submit();.

我究竟做错了什么?

我的最终目标是为每一行生成一个唯一的URL,以便我的收件人可以使用该URL随时更新他们的响应(getEditResponseUrl()).

Ala*_*lls 5

您需要在每个循环上创建一个新响应.现在,您正在创建一个新的响应,并且在每次迭代时,代码都使用相同的表单响应.因此,您会收到已经提交的错误.

编辑:这是一些新的代码.它有一个内环for.外部for循环遍历电子表格行的数量.内部for循环在单个表单响应中循环遍历项目.

submit方法不能在内循环中使用.每个表单项(问题)必须输入一个答案createResponse(),然后必须添加响应以形成响应.单词响应可以用于整个表单响应,也可以用于单个问题的响应.

然后将项目响应添加到表单响应中:

newResponse.withItemResponse(itemResponse);
Run Code Online (Sandbox Code Playgroud)

这个方法的名字withItemResponse让我感到困惑.我预计我需要链接另一种方法,但事实并非如此.

这是正在运行的代码:

function createSurveyResponses(ss_ID) {
  if (ss_ID === undefined) {
    ss_ID = '';
  };

  var ss = SpreadsheetApp.openById(ss_ID);
  var sheet = ss.getSheetByName('Sheet1');
  //Get data starting in row 2, column 2
  var data = sheet.getRange(2, 2, sheet.getLastRow()-1, sheet.getLastColumn()-1).getValues(); 
  var i = 0,
      j = 0,
      form,
      items,
      thisRow,
      Name = "",
      Email = "",
      Revenue,
      FormURL = "",
      formID,
      thisItem,
      itemTypeIs,
      response,
      arraySS_Values = [],
      editURL;
      var arrayItemNames = ['Name','Email','Revenue'];

  for (i=0;i<data.length;i+=1) {
    thisRow = data[i];
    Name = thisRow[0];
    Email = thisRow[1];
    Revenue = thisRow[2];
    FormURL = thisRow[3];

    arraySS_Values = [];

    arraySS_Values.push(Name);//Fill an array with the cell values of one row from the spreadsheet
    arraySS_Values.push(Email);
    arraySS_Values.push(Revenue);

    Logger.log('Name: ' + Name);

    if (FormURL === "" || FormURL === undefined) { //If there is no form, create one
      form = FormApp.create(Name);
      formID = form.getId();
      items = addItemsToForm(form, arrayItemNames);
    } else {
      form = FormApp.openByUrl(FormURL);
      items = form.getItems(FormApp.ItemType.TEXT);
      if (items.length === 0) { //If there are no form items, you must add them
        items = addItemsToForm(form, arrayItemNames);
      };
    };

    var newResponse = form.createResponse();

    for (j=0;j<items.length;j+=1) {
      thisItem = items[j];
      itemTypeIs = thisItem.getType();

      if (itemTypeIs===FormApp.ItemType.IMAGE || itemTypeIs===FormApp.ItemType.PAGE_BREAK || itemTypeIs===FormApp.ItemType.SECTION_HEADER) {
        continue; //quit this loop, and loop again if the form item is an image, page break or section header
      };

      if (itemTypeIs === FormApp.ItemType.TEXT) {
        var textItem = thisItem.asTextItem();
        var itemResponse = textItem.createResponse(arraySS_Values[j]);

        newResponse.withItemResponse(itemResponse);
        Logger.log('itemResponse: ' + itemResponse.getResponse());
      };
    };

    newResponse.submit();
    var preFill_url = newResponse.toPrefilledUrl();
    Logger.log('preFill_url: ' + preFill_url);

    sheet.getRange(i+2, 5).setValue(preFill_url);
  };
};

function addItemsToForm(form, arrayItemNames) {
  var i=0;
  for (i=0;i<arrayItemNames.length;i+=1) {
    form.addTextItem().setTitle(arrayItemNames[i]);
  };

  return form.getItems();
};
Run Code Online (Sandbox Code Playgroud)

代码试图处理表单是否已存在的情况.如果电子表格没有表单URL,则会创建一个新表单.我不知道您是否可以使用此代码缩短URL,因为它可能需要使用URL打开表单.