google-apps-script - 将数据从一张表映射到另一张表
问题描述
我的情况与此问题中的情况类似,我试图在提交表单时将用户人口统计数据映射到响应表。该解决方案在所有情况下都能正常工作。每当其中一个用户 ID 与名册上可用的 ID 不对应时,它就会跳过该行并继续前进到下一行。
当我尝试修改代码以包含更多列时遇到问题(我也想扫描并将列 I 从“名册表”映射到“响应表”中)。这是原始解决方案:
function extractId() {
var responsesSheet = SpreadsheetApp.openById('XXXXXXX').getSheetByName('Sheet1');
var rosterSheet = SpreadsheetApp.openById('XXXXXXX').getSheetByName('Sheet1');
var valuesOfresponsesSheet = responsesSheet.getRange(2, 2, responsesSheet.getLastRow() - 1, 1).getValues();
var valuesOfrosterSheet = rosterSheet.getRange(2, 1, rosterSheet.getLastRow() - 1, 8).getValues();
var obj = valuesOfrosterSheet.reduce(function(o, e) {
o[e[0]] = [e[0], e[1], e[5], e[6], e[7]];
return o;
}, {});
// var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].replace(/\@(.*)/i,"")]});
var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].toString().replace(/\@(.*)/i,"")] || ["","","","",""]}); // Modified
responsesSheet.getRange(2, 3, resultValues.length, resultValues[0].length).setValues(resultValues);
}
这就是我修改它的方式:
function extractId() {
var responsesSheet = SpreadsheetApp.openById('1bDtDMkWDosKsf0EDV08VY-pzE8Okr5kqQU0vnNps6mo').getSheetByName('Form Responses 1');
var rosterSheet = SpreadsheetApp.openById('196JpI3cvJZOynhqL0kyBoxqXap9NtykBG5RvCPtl7dA').getSheetByName('Sheet1');
var valuesOfresponsesSheet = responsesSheet.getRange(2, 2, responsesSheet.getLastRow() - 1, 1).getValues();
var valuesOfrosterSheet = rosterSheet.getRange(2, 1, rosterSheet.getLastRow() - 1, 9).getValues();
var obj = valuesOfrosterSheet.reduce(function(o, e) {
o[e[0]] = [e[0], e[1], e[5], e[6], e[7], e[8]];
return o;
}, {});
// var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].replace(/\@(.*)/i,"")]});
var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].toString().replace(/\@(.*)/i,"")] || ["","","","",""]}); // Modified
responsesSheet.getRange(2, 3, resultValues.length, resultValues[0].length).setValues(resultValues);
}
我遇到的问题是,只要没有 ID 匹配(即如果“响应表”的 B 列与“名册表”中 A 列的项目之一不匹配),我就会收到以下错误:The number of columns in the data does not match the number of columns in the range. The data has 5 but the range has 6. (line 14, file "Code")
. 代码在不匹配 ID 恰好位于的那一行停止工作。
我想要的是,如果代码没有 ID 匹配,则只需继续前进到下一行。
解决方案
这个改装怎么样?
在您的修改中,我可以确认添加了一个元素,例如o[e[0]] = [e[0], e[1], e[5], e[6], e[7], e[8]]
. 在这种情况下,e[8]
被添加。所以在这种情况下,还需要在["","","","",""]
like中添加一个元素["","","","","",""]
。我认为这是您的问题的原因。
因此,请在您的问题中修改您的底部脚本,如下所示。
从:
var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].toString().replace(/\@(.*)/i,"")] || ["","","","",""]});
到:
var resultValues = valuesOfresponsesSheet.map(function(e) {return obj[e[0].toString().replace(/\@(.*)/i,"")] || ["","","","","",""]});
如果这不是直接的解决方案,我深表歉意。届时,您能否提供用于复制您的问题的示例电子表格。借此,我想确认一下。