首页 > 解决方案 > 将数据从一张表映射到另一张表

问题描述

我的情况与此问题中的情况类似,我试图在提交表单时将用户人口统计数据映射到响应表。该解决方案在所有情况下都能正常工作。每当其中一个用户 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 匹配,则只需继续前进到下一行。

标签: google-apps-scriptgoogle-sheets

解决方案


这个改装怎么样?

在您的修改中,我可以确认添加了一个元素,例如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,"")] || ["","","","","",""]});

如果这不是直接的解决方案,我深表歉意。届时,您能否提供用于复制您的问题的示例电子表格。借此,我想确认一下。


推荐阅读