【问题标题】:Issue in creating script that copy the sheet and update it based on form response创建复制工作表并根据表单响应更新工作表的脚本时出现问题
【发布时间】:2021-03-03 12:33:06
【问题描述】:

当用户提交表单时,我尝试在同一文件夹中制作模板副本,然后根据用户在表单响应中提交的内容更新新复制工作表中的字段。

新工作表创建成功,但我在表单中得到的响应没有在新工作表中更新。 在代码中查找问题时需要帮助

错误显示:

TypeError:无法读取未定义的属性“0” 在 CopySheet(代码:32:63) 在 getResponse(代码:3:16)

function getResponse(e){
 var response = e.response;
 var sheetID = CopySheet(response);
}



function CopySheet(response) {
  var ss = SpreadsheetApp.openById('1Q5XRV7E-m6IleX4vG2tqmJ104Osz6rb67tc8SA_1avk');
  var ssname = ss.getSheetByName('Template');
  
  var file = DriveApp.getFileById(ss.getId());
  var folders = file.getParents();
  while (folders.hasNext())
  {
    var folder = folders.next();
    var FID = folder.getId();
  }
  var protection = ssname.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  var editors = protection[0].getEditors();
  Logger.log(editors);
 
  var TargetFolder = DriveApp.getFolderById(FID);
  var CSheetID = DriveApp.getFileById(ss.getId()).makeCopy("CopiedTemplate", TargetFolder).getId();
  var CopiedSheet = SpreadsheetApp.openById(CSheetID);
  var ptc = CopiedSheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
  for (var j = 0 ; j<ptc.length ; j++)
  {
   ptc[j].addEditors(editors);
  }
  
  CopiedSheet.getRange('C1').setValue(response['S.C.O Number'][0]);
  CopiedSheet.getRange('F1').setValue(response['Qty'][0]);
  CopiedSheet.getRange('E2').setValue(response['PCBA Code'][0]);
  
  DriveApp.getFileById(CSheetID).setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);
  
  return CSheetID;
}

编辑代码:

function getResponse(e){
   var response2 = e.response;
   var IResponse = response2.getItemResponses();
   var SCO_Number = IResponse[0].getResponse();
   var BOM_Code = IResponse[1].getResponse();
   var qty = IResponse[2].getResponse();
   var SID = CopySheet(SCO_Number,BOM_Code,qty);
   
}

【问题讨论】:

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


    【解决方案1】:

    那是因为您正在访问一个空变量的0th 索引。

    改用e.values

    代码:

    function getResponse(e){
     var response = e.values;
     Logger.log(response);
     // var sheetID = CopySheet(response);
    }
    

    在检查响应的值后,它应该看起来像这样。

    • 响应的索引 0 是提交表单的日期。
    • 索引 1 是第一个问题的答案
    • 索引 2 用于第二个问题,依此类推

    只需使用问题的顺序,然后将其用作索引。

    示例:

    如果S.C.O Number的值是第一个问题的答案,那么得到答案的值应该是response[1]

    代码:

    CopiedSheet.getRange('C1').setValue(response[1]); // answer to 1st question
    CopiedSheet.getRange('F1').setValue(response[2]); // answer to 2nd question
    CopiedSheet.getRange('E2').setValue(response[3]); // answer to 3rd question
    

    【讨论】:

    • 感谢您的回复,实际上此脚本在表单端运行,因此 e.values 在云日志上返回 null,这是电子表格端脚本的正确方法。我根据 AppScript 文档中提到的内容更改了脚本,并在这些更改后工作。上面编辑。再次感谢..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多