【问题标题】:Is there a limit to how many G-Forms i can link to a singe google spreadshee?我可以链接到单个 Google 电子表格的 G-Forms 是否有限制?
【发布时间】:2015-03-16 03:33:49
【问题描述】:

我有一个脚本,旨在创建大约 120 个表单并将它们链接到一个电子表格,我将在其中分析数据。在我的电子表格有十几个与之链接的表单之前,我的脚本没有任何问题。然后我收到一条错误消息,指出目标 ID 无效,在记录 ID 并将其手动输入到 url 后,我发现 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。

经过多年在 Web 开发中使用和修改 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;
}

【问题讨论】:

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


    【解决方案1】:

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

    或者,您需要使用 Apps 脚本 HTML 服务构建一个表单,将其嵌入到 Google 站点的 Apps 脚本小工具中,然后让每个人都从站点填写表单。

    【讨论】:

    • 谢谢,我已经开始考虑完全放弃表格并使用.getResponses 方法(?),但我希望不必诉诸于此。拥有易于浏览的用户体验友好电子表格集合非常适合我的应用程序。说到文件夹,复制然后从根目录删除原始文件,真的是用 GAScripts 移动文件的唯一方法吗?当表单链接到电子表格时,它变得相当复杂。使用“高级”Drive API(或 SDK,无论其名称如何)的任何资源
    • 您可以将文件直接保存或创建到文件夹中。首先获取对文件夹的引用,然后在文件夹上使用方法,而不是在 DriveApp 上。您可以随时搜索类似的问题,或提出其他问题。
    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多