如何在将Google表格中的答案插入表单时插入空白字段

时间:2017-01-16 13:57:34

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

我已经设置了一个脚本,可以从Google表格中将现有答案插入我的Google表单(通过调整this answer中的代码)。我将它插入到Forms Scripts中,当填充Sheet中的所有字段时它都可以工作。但是,表格问卷的性质是这样的,可能会跳过某些部分,从而使表格中的某些字段为空。我想插入这样一个Sheet,它的一些答案字段是空白的。

当工作表中的所有字段都被填充时,脚本会起作用,但是当它遇到空白字段时就不起作用(这意味着其中包含任何空白字段的第一行答案会停止执行脚本)

我想知道的是如何向我的脚本解释它应该只接受空白答案并插入它们?

这是脚本:

function ApendResponses() {
  var form = FormApp.openById("1M-mTBlZPRj44jXs_YHj-cNa9yHjU25ItEWBuKtUvKZo");
  var sheet = SpreadsheetApp.openByUrl("https://ocs.google.com/spreadsheets/d/1Jc9NVlN-Wcmd87E-FnyocHgl5Vx2WXqOGPTkhvXjCFU/");
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  for (var x = 0; x < values.length; x++) {

    var formResponse = form.createResponse();
    var items = form.getItems();

    var row = values[x];

    var formItem = items[0.0].asTextItem();   
    var response = formItem.createResponse(row[1]);     
    formResponse.withItemResponse(response);

    var formItem = items[1.0].asTextItem();   
    var response = formItem.createResponse(row[2]);     
    formResponse.withItemResponse(response);

    var formItem = items[2.0].asListItem();   
    var response = formItem.createResponse(row[3]);     
    formResponse.withItemResponse(response);

    var formItem = items[3.0].asPageBreakItem();       
    formResponse.withItemResponse(response);

    var formItem = items[4.0].asListItem();   
    var response = formItem.createResponse(row[4]);     
    formResponse.withItemResponse(response);

    var formItem = items[5.0].asPageBreakItem();       
    formResponse.withItemResponse(response);

    var formItem = items[6.0].asListItem();   
    var response = formItem.createResponse(row[5]);     
    formResponse.withItemResponse(response);

    var formItem = items[7.0].asPageBreakItem();       
    formResponse.withItemResponse(response);

    var formItem = items[8.0].asTextItem();   
    var response = formItem.createResponse(row[6]);     
    formResponse.withItemResponse(response);

    formResponse.submit();
    Utilities.sleep(500);

  }

};

示例Form is here及其accompanying Sheet here(为了测试目的,我在第三行留下了一个空白字段)。

1 个答案:

答案 0 :(得分:0)

这是一个有效的解决方案:

function ApendResponses() {
  var form = FormApp.openById("1M-mTBlZPRj44jXs_YHj-cNa9yHjU25ItEWBuKtUvKZo");
  var sheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1Jc9NVlN-Wcmd87E-FnyocHgl5Vx2WXqOGPTkhvXjCFU/");
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  for (var x = 0; x < values.length; x++) {

    var formResponse = form.createResponse();
    var items = form.getItems();

    var row = values[x];

    var formItem = items[0.0].asTextItem();
    if (!isempty(row[1])){
    var response = formItem.createResponse(row[1]);
    formResponse.withItemResponse(response);}

    var formItem = items[1.0].asTextItem();
    if (!isempty(row[2])){
    var response = formItem.createResponse(row[2]);
    formResponse.withItemResponse(response);}

    var formItem = items[2.0].asListItem();
    if (!isempty(row[3])){
    var response = formItem.createResponse(row[3]);
    formResponse.withItemResponse(response);}

    var formItem = items[3.0].asPageBreakItem();                       
    formResponse.withItemResponse(response);

    var formItem = items[4.0].asListItem();
    if (!isempty(row[4])){
    var response = formItem.createResponse(row[4]);
    formResponse.withItemResponse(response);}

    var formItem = items[5.0].asPageBreakItem();
    formResponse.withItemResponse(response);

    var formItem = items[6.0].asListItem();
    if (!isempty(row[5])){
    var response = formItem.createResponse(row[5]);
    formResponse.withItemResponse(response);}

    var formItem = items[7.0].asPageBreakItem();
    formResponse.withItemResponse(response);

    var formItem = items[8.0].asTextItem();
    if (!isempty(row[6])){
    var response = formItem.createResponse(row[6]);
    formResponse.withItemResponse(response);}

    formResponse.submit();
    Utilities.sleep(0.01);

  }

}

function isempty(entry) {
  if (entry == undefined)
  {
    return true;
  }

  if (entry == null){
   return true; 
  }
   var tempstr = entry.toString();

   tempstr = tempstr.replace(/[\r\n\t\s]+$/,"");
   tempstr = tempstr.replace(/^[\r\n\t\s]+/,"");
  if (tempstr.length == 0){

    return true;
  } else {

    return false;
  }

}

此解决方案有两个问题:

  1. 它不会停止,即在脚本处理完最后一行后,它会继续添加空白行。这很容易处理:在注入正确数量的答案后需要停止脚本,并且可以从表单的“响应”选项卡中单独删除任何多余的答案。

  2. 运行脚本有6分钟的时间限制。因此,这个脚本无法处理大量的答案(绝对不超过500)。可以通过更好的脚本编写(停止,记录处理的答案,然后从那里再次运行直到完成工作)或通过将答案分成几张并依次运行它们来进行变通办法。

  3. Source.