首页 > 解决方案 > 使用 for 循环将数据从一张 Google 表格映射到另一张

问题描述

我对 Google Scripts 还是很陌生。我有一个学生名册 Google 表格,其中包含人口统计信息,包括身份证号码。我还有一个回复表,它会自动收集 B 列上的电子邮件地址(电子邮件地址由 ID 号加上“@foo.org”创建)。我试图让我的脚本解析自动收集的电子邮件,将电子邮件的 ID 部分映射到 C 列。然后我使用 for 循环对照我的主要花名册检查提取的 ID 号,并映射剩余信息同一个学生在回答表上。

截至目前,我只能正确映射响应表中的第一行;从第二行开始,我只看到数字 ID,但它没有映射其他相关列。这是我目前拥有的:

function extractId() {
  var responsesSheet = SpreadsheetApp.openById('XXXXXXX').getSheetByName('Sheet1');
  var rosterSheet = SpreadsheetApp.openById('XXXXXXX').getSheetByName('Sheet1');

  var responsesHighestEntry = responsesSheet.getLastRow();

  var email;
  var idNumber;

  var rosterLastRow = rosterSheet.getLastRow();
  var rosterArray = rosterSheet.getRange(2, 1, (rosterLastRow - 1)).getValues();
  var studentResponsesRow;

  var i;
  var x;
  var y = 2;
  var fullName;
  var grade;
  var advisoryTeacher;
  var advisoryRoom;


  for (i = 2; i < responsesHighestEntry; i++) {
    email = responsesSheet.getRange(i, 2).getValue();
    idNumber = email.replace(/\@(.*)/i,"");
    responsesSheet.getRange(i, 3).setValue(idNumber);

    for (x = 0; x < rosterLastRow; x++) { 
      if (rosterArray[x] == idNumber) {
        studentResponsesRow = y;

        fullName = rosterSheet.getRange(y, 2).getValue(); 
        responsesSheet.getRange(y, 4).setValue(fullName);

        grade = rosterSheet.getRange(x + 2, 6).getValue(); 
        responsesSheet.getRange(studentResponsesRow, 5).setValue(grade);

        advisoryTeacher = rosterSheet.getRange(x + 2, 7).getValue(); 
        responsesSheet.getRange(studentResponsesRow, 6).setValue(advisoryTeacher);

        advisoryRoom = rosterSheet.getRange(x + 2, 8).getValue(); 
        responsesSheet.getRange(studentResponsesRow, 7).setValue(advisoryRoom);
      } 

      y++;

    }
  }
}

样本名册带有人口统计数据的样本名册。

样本最终结果响应表样本最终结果响应表。在这种情况下,电子邮件地址是自动收集的。列 CG 将是运行脚本的结果。

标签: javascriptfor-loopgoogle-apps-scriptgoogle-sheetsmapping

解决方案


  • 您想从问题图像中的“名册表”的值中获得“样本最终结果响应表”。
    • 在您的情况下,“回复表”只有包含电子邮件地址的“B”列。
    • 您希望将来自电子邮件地址的 ID 与“名册表”中的“A”列相同的值。
  • 您想使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。

修改后的脚本流程如下。

  1. 从“响应表”中检索“B”列的值。
  2. 从“名册表”中检索值。
  3. 创建用于搜索 ID 的对象。
  4. 将结果值创建为数组。
  5. 将值放入“响应表”。

修改后的脚本:

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);
}

参考:


推荐阅读