简体   繁体   English

使用 for 循环将数据从一个 Google Sheet 映射到另一个

[英]Use for loop to map data from one Google Sheet to another one

I'm still fairly new with Google Scripts.我对 Google Scripts 还是很陌生。 I have a student roster Google Sheet with demographic information, including ID numbers.我有一个包含人口统计信息(包括 ID 号)的学生名册 Google 表格。 I also have a responses Sheet that automatically collects email addresses on Column B (email addresses are created by the ID number plus "@foo.org").我还有一个响应表,可以自动收集 B 列上的电子邮件地址(电子邮件地址由 ID 号加上“@foo.org”创建)。 I'm trying to get my script to parse through auto-collected emails, map the ID portion of the email onto column C. Then I'm using for loops to check the extracted ID number against my main roster, and map the remaining information for the same student on the responses sheet.我正在尝试让我的脚本通过自动收集的电子邮件进行解析,将电子邮件的 ID 部分映射到 C 列上。然后我使用 for 循环根据我的主名册检查提取的 ID 号,并映射剩余的信息对于回答表上的同一个学生。

As of now, 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,但没有映射其他相关列。 This is what I currently have:这是我目前拥有的:

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 roster sheet with demographic data.包含人口统计数据的样本名册表。

样本最终结果响应表 Sample end-result responses sheet.样本最终结果响应表。 In this case, the email addresses are auto-collected.在这种情况下,电子邮件地址是自动收集的。 Columns CG would be the result of running the script.列 CG 将是运行脚本的结果。

  • You want to achieve "Sample end-result responses sheet" from the values of "roster sheet" in the images in your question.您想从问题图像中“名册表”的值中获得“最终结果响应表示例”。
    • In your situation, "responses sheet" has only the column "B" which has the email addresses.在您的情况下,“回复表”只有包含电子邮件地址的“B”列。
    • You want to put the values that the ID from the email address is the same with the column "A" in "roster sheet".您希望将电子邮件地址中的 ID 与“名册表”中的“A”列相同的值。
  • You want to achieve this using Google Apps Script.您想使用 Google Apps 脚本来实现这一点。

If my understanding is correct, how about this answer?如果我的理解是正确的,这个答案怎么样? Please think of this as just one of several possible answers.请将此视为几种可能的答案之一。

The flow of this modified script is as follows.这个修改后的脚本的流程如下。

  1. Retrieve the values of the column "B" from "responses sheet".从“响应表”中检索“B”列的值。
  2. Retrieve the values from "roster sheet".从“名册表”中检索值。
  3. Create an object for searching IDs.创建一个用于搜索 ID 的对象。
  4. Create the result values as an array.将结果值创建为数组。
  5. Put the values to "responses sheet".将值放入“响应表”。

Modified script:修改后的脚本:

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

Reference:参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Google 工作表应用程序脚本 - 根据循环条件将数据从一张工作表复制到另一张工作表 - Google sheet app script - Copy data from one sheet to another based on condition with loop 将数据从一个Google工作表工作簿移动到另一个工作簿 - Move Data From one google sheet workbook to another 将数据从一张纸复制到另一张 - Google Script - Copy Data from one sheet to another - Google Script 从一个Google工作表中获取值,并通过4循环将其输入到另一工作表中 - Get Values from one google sheet enter it onto another sheet with a 4 loop Google 工作表脚本将数据集从一张工作表复制到另一张工作表的顶部(仅限值) - Google sheets script copy data sets from one sheet to another (values only) at the top of the sheet 如何从一张工作表中获取Google Spreadsheet中的数据行,并预先填充另一张工作表 - How to take rows of data in Google Spreadsheet from one sheet, and pre-populate another sheet 将范围从一个工作表复制到Google工作表中的另一个工作表 - Copy a range from one sheet to another in google sheet 将数据从一张表传输到另一张表并删除谷歌表中的旧数据 - Transfer Data from one sheet to another and deleting old data in google sheets 使用 Google App 脚本将数据从一张工作表复制到另一张工作表时执行缓慢 - Slow Execution for Copying Data from One Sheet to Another Using Google App Script Google电子表格将值从一行复制到另一张工作表 - Google spreadsheet copy values from one row to another sheet
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM