【问题标题】:Map data from one sheet to another将数据从一张表映射到另一张表
【发布时间】:2020-01-21 07:08:37
【问题描述】:

我的情况类似于this question 中的情况,我试图在提交表单时将用户人口统计数据映射到响应表。该解决方案在所有情况下都能正常工作。每当其中一个用户 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-script google-sheets


    【解决方案1】:

    这个修改怎么样?

    在您的修改中,我可以确认添加了一个元素,例如 o[e[0]] = [e[0], e[1], e[5], e[6], e[7], e[8]]。在这种情况下,添加了e[8]。所以在这种情况下,还需要在["","","","",""] 中添加一个元素,如["","","","","",""]。我认为这是您的问题的原因。

    所以请修改您问题中的底部脚本,如下所示。

    发件人:

    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,"")] || ["","","","","",""]});
    

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

    【讨论】:

    • 这就是诀窍,我从你的回答中学到了很多东西。
    • @gonzalo2000 感谢您的回复。很高兴您的问题得到解决。
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多