【问题标题】:Use for loop to map data from one Google Sheet to another one使用 for 循环将数据从一张 Google 表格映射到另一张表格
【发布时间】:2020-04-12 14:37:06
【问题描述】:

我对 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++;

    }
  }
}

包含人口统计数据的样本名册。

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

【问题讨论】:

  • 您能否提供一个示例电子表格,包括用于复制I'm only able to correctly map the first row in the responses sheet; As of the second row I only see the numeric IDs but it doesn't map the other relevant columns. 情况的脚本?当然,请删除您的个人信息。顺便说一句,在您的脚本中,似乎 ID 是从电子邮件中检索的。但是直接从“C”列中检索它怎么样?
  • 第二张图片是执行脚本的图片。第一个 for 循环的第一部分从电子邮件中提取 ID,并在 C 列上设置值。然后,在第二个 for 循环中,我试图将该 ID 与花名册表进行交叉检查(第一张图片) ,然后将数据映射到响应行中的相关列。该脚本包括将全名映射到第二个图像的 D 列。出于工作机密的原因,我无法提供除图片以外的样张。
  • 感谢您的回复。我了解到您无法提供示例电子表格。能否提供关于I'm only able to correctly map the first row in the responses sheet...的复制方法?因为虽然我准备了图像的样本表,但我无法使用您更新的脚本复制您的情况。所以我认为图像样本可能与实际格式不同。顺便说一句,在您的脚本中,似乎 ID 是从电子邮件中检索的。但是如何直接从“C”列中检索它呢?如果我误解了您的情况,我深表歉意。
  • 感谢您的回复。上述脚本的第 29-42 行是将内容映射到我的原始文件的内容。在我原来的设置中,第二个图像只有 B 列。目的是第二个 for 循环检查从电子邮件中提取的 ID 与名册并将数据映射到响应表上。 (他的总体想法是将 Google 表单设置为自动收集电子邮件。回复表(即第二张图片)将具有 B 列,然后脚本根据准确的数据生成 CG 列。我在之后遇到了问题循环的第一次迭代。
  • 感谢您的回复。我以为我能理解你的目标。所以我提出了一个修改后的脚本作为答案。你能确认一下吗?如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

标签: javascript for-loop google-apps-script google-sheets mapping


【解决方案1】:
  • 您希望从问题图像中的“名册表”的值中获得“样本最终结果响应表”。
    • 在您的情况下,“回复表”只有包含电子邮件地址的“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);
}

参考:

【讨论】:

  • 感谢您的关注,我收到了错误Cannot convert Array to number[][]. (line 11, file "Code")
  • @gonzalo2000 感谢您的回复。我带来的不便表示歉意。虽然我为您的 2 张图像样本表准备了样本脚本,但关于错误,我估计可能存在找不到 ID 的情况。考虑到这一点,我更新了我的示例脚本。你能确认一下吗?但我不确定你的实际值。因此,如果这不能解决问题,我深表歉意。那时,您能否提供一个示例电子表格,用于在没有个人信息的情况下复制问题?通过这个,我想检查一下这个问题。
  • @gonzalo2000 感谢您的回复。很高兴您的问题得到解决。
  • 我尝试通过在第 5 行和第 7 行 2, 1, rosterSheet.getLastRow() - 1, 9e[8] 中包含另一行来调整此解决方案,现在如果其中一行为空白或不包含我的花名册中的 ID表我看到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")。有没有办法解决这个问题?
  • 感谢您的回复。我已将其作为一个新问题发布在这里:stackoverflow.com/questions/59826919/… 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-01-21
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多