我可以链接到单个Google电子表格的G-Forms数量是否有限制?

时间:2015-03-16 03:33:49

标签: google-apps-script google-sheets google-form

我有一个脚本,旨在创建大约120个表单并将它们链接到一个电子表格,我将分析数据。在我的电子表格中包含大约十几个与之关联的表单之前,我对脚本没有任何问题。然后我收到一条错误,说明目的地ID无效,记录身份后,手动输入到网址我发现ID没有问题....

  var ssSummaryId = '******redacted*******';

  var form = FormApp.create('RM#' + rmNumber).setDestination(FormApp.DestinationType.SPREADSHEET, ssSummaryId);
  form.setDescription(valuesSummary[ii][2])
  .setConfirmationMessage('Thanks for the update on room ' + rmNumber)
  .setShowLinkToRespondAgain(false);

//  form.setDestination(FormApp.DestinationType.SPREADSHEET, ssSummaryId);
  var formId = form.getId();
  var formUrl = form.getPublishedUrl();

编辑我正在添加完整的脚本和一些其他信息,以防万一有人想检查我的代码并指出所有新手的错误。


我正在使用Google脚本构建电子表格,然后创建120个略有改动的Google表单,这些表单链接到单个电子表格,所有响应都是在名为“表单响应n”的单独表单上设计的。一旦我超过10张与一张纸相关的表格,我就会不停地撞墙。注意;在初始测试中,我记得有一个电子表格,其中包含46个表格(以及表格)。正如您在下面的代码中看到的那样,我在每创建5个表单之后从应用程序重新启动它,因此我没有得到任何“扩展运行时错误”。只是下面的错误,通常在脚本运行两次之后来自Google Scripts IDE。

在网络开发中使用和修改js多年后,我终于掌握了基本的javascript。所以我为糟糕的代码道歉。

无法设置响应目标。验证目标ID,然后重试。 (第54行,文件“代码”)

function spreadsheet_builder() {

  var ssSummaryId = '<<REDACTED>>';
  var ssFormDataId = '<<REDACTED>>';
  var batchSize = 5;  
  var buildStatus = false;
  var ssSummary = SpreadsheetApp.openById(ssSummaryId);
  SpreadsheetApp.setActiveSpreadsheet(ssSummary);

  if (ssSummary.getSheetByName('Summary') == null) {
    var sheetSummary = ssSummary.getSheetByName('Sheet1');
  } else {
    var sheetSummary = ssSummary.getSheetByName('Summary');
  }
  var rangeSummary = sheetSummary.getDataRange();
  var valuesSummary = rangeSummary.getValues();

  buildStatus = get_last_position(valuesSummary, buildStatus); //either returns last position in array or 'true' if task is complete

  if (buildStatus != true || buildStatus > 0) {
    var formCreation = [];
    var formData = get_form_data(ssFormDataId);  // Get form questions from form Data ss, might be better to keep everything on the same sheet
    batchSize = buildStatus + batchSize;

      for ( var ii = buildStatus; ii < batchSize; ii++ ) {
         if (valuesSummary[ii][1] != '') {
           var formCreationReturn = form_builder(formData, valuesSummary, ii, ssSummaryId);
           formCreation.push(formCreationReturn);
         }
       }

    var aSum = [ssSummary, sheetSummary, rangeSummary];
    final_storing_operation(formCreation, aSum, buildStatus);
  }
  if (sheetSummary.getName() != 'Summary') { 
    SpreadsheetApp.setActiveSpreadsheet(ssSummary);
    sheetSummary.activate().setName('Summary');
    sheetSummary.setFrozenColumns(3);
    sheetSummary.setFrozenRows(1);
    sheetSummary.hideColumns(1);  
    //var sSumIndex = sheetSummary.getIndex();
  }
  SpreadsheetApp.setActiveSpreadsheet(ssSummary);
  sheetSummary.activate();
  ssSummary.moveActiveSheet(1);  
}


function form_builder(formData, valuesSummary, ii, ssSummaryId) {

  var lastFormCreated = ii;
  var rmNumber = valuesSummary[ii][1];

  var form = FormApp.create('RM#' + rmNumber).setDestination(FormApp.DestinationType.SPREADSHEET, ssSummaryId);
      form.setDescription(valuesSummary[ii][2])
      .setConfirmationMessage('Thanks for the update on room ' + rmNumber)
      .setShowLinkToRespondAgain(false);

//  form.setDestination(FormApp.DestinationType.SPREADSHEET, ssSummaryId);
  var formId = form.getId();
  var formUrl = form.getPublishedUrl();

  var sectionHeader = 'SECTION_HEADER';      //preformatted form question types.
  var list = 'LIST';
  var paragraphText = 'PARAGRAPH_TEXT';

  for (var j = 1; j < formData.length; j++) {     //top row is header
    switch (formData[j][0]) {
      case sectionHeader:
        form.addSectionHeaderItem().setTitle(formData[j][1]);
        break;

      case list:                                     
        var item = form.addListItem();
        item.setTitle(formData[j][1]).setHelpText(formData[j][2]);
           item.setChoices([
             item.createChoice(formData[j][3]),
             item.createChoice(formData[j][4]),
             item.createChoice(formData[j][5])
          ]);
        break;

      case paragraphText:
        form.addParagraphTextItem().setTitle(formData[j][1]);
        break;

      default:
        form.addSectionHeaderItem().setTitle('OOPS u\'don MESSED up');
        break;
    }
  }
  return [formId, formUrl, lastFormCreated, rmNumber];
}  

function final_storing_operation(formCreation, aSum, buildStatus) {

  SpreadsheetApp.setActiveSpreadsheet(aSum[0]);
  aSum[1].activate();

  var startRow = formCreation[0][2] + 1;
  var newRange = aSum[1].getRange(startRow, 1, formCreation.length, 2);  //row, clmn, rows, columns

  var newValues = [];
  for ( var ij = 0; ij < formCreation.length; ij++) {

    var values = [formCreation[ij][0], "\=HYPERLINK(\"" + formCreation[ij][1] + "\", \"RM#" + formCreation[ij][3] + "\")"];
    newValues.push(values);
  }

  newRange.setValues(newValues);

}

function get_last_position (valuesSummary, buildStatus) {
  var rowPos = 1;                                   // start at 1 to ignore headers
  while (valuesSummary[rowPos][1] != '') {    
    if (valuesSummary[rowPos][0] == '') { 
      return rowPos;
    } 
    rowPos++;
  }
   if(valuesSummary[rowPos][0] != '' && valuesSummary[rowPos][1] != '') {
      buildStatus = true;
      return buildStatus;
    }
}

function get_form_data (ssFormDataId) {
  var ssFormData = SpreadsheetApp.openById(ssFormDataId);
  SpreadsheetApp.setActiveSpreadsheet(ssFormData);
  var sheetFormData = ssFormData.getSheets()[0];
  var rangeFormData = sheetFormData.getDataRange();
  var valuesFormData = rangeFormData.getValues();
  return valuesFormData;
}

1 个答案:

答案 0 :(得分:0)

作为替代方案,您可以创建表单,并且有意不将它们链接到电子表格,然后使用一些循环遍历每个表单的代码,并提取数据。您可能希望将表单放入自己的文件夹中。

或者,您需要使用Apps脚本HTML服务构建一个表单,将其嵌入到Google网站的Apps脚本小工具中,并让所有人填写网站上的表单。