创建复制 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
我正在尝试在用户提交表单时在同一文件夹中制作模板副本,而不是根据用户在表单响应中提交的内容更新新副本中的字段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