[英]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 将是运行脚本的结果。
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.这个修改后的脚本的流程如下。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.