2017-01-16 91 views
0

我已经设置了一个脚本,可以将现有答案从Google表格插入到Google表单中(通过修改this answer中的代码)。我将它插入到表单脚本中,并且它在表单中的所有字段都被填充时起作用。然而,表格调查问卷的性质是这样的,某些章节可能会被跳过,因此表格中的一些字段为空。我想插入这样的表格,其中一些答案字段留空。如何在将Google表格的答案插入到Google表格中时插入空白字段

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

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

这里是脚本:

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(I第三行用于测试目的在左空白字段)。

回答

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个)。解决方法可以通过更好的脚本编写(停止,记录处理的答案,然后再次运行,直到完成工作),或者将答案分成几张并逐一运行。

Source.