创建复制 sheet 并根据表单响应更新它的脚本时出现问题

Issue in creating script that copy the sheet and update it based on form response

我正在尝试在用户提交表单时在同一文件夹中制作模板副本,而不是根据用户在表单响应中提交的内容更新新副本中的字段sheet。

新 sheet 正在成功创建,但我在表单中收到的响应未在新 sheet 中更新。 需要帮助查找代码中的问题

错误显示:

TypeError: Cannot read property '0' of undefined at CopySheet(Code:32:63) at getResponse(Code: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);
   
}

那是因为您正在访问空变量的 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