javascript - 使用 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++;
}
}
}
解决方案
- 您想从问题图像中的“名册表”的值中获得“样本最终结果响应表”。
- 在您的情况下,“回复表”只有包含电子邮件地址的“B”列。
- 您希望将来自电子邮件地址的 ID 与“名册表”中的“A”列相同的值。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。
修改后的脚本流程如下。
- 从“响应表”中检索“B”列的值。
- 从“名册表”中检索值。
- 创建用于搜索 ID 的对象。
- 将结果值创建为数组。
- 将值放入“响应表”。
修改后的脚本:
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);
}
参考:
推荐阅读
- python - 按列聚合熊猫数据框
- byte-buddy - 使用 ByteBuddy,如何执行 MethodCall.invoke(someMethodDescription).onThis() 的等效操作?
- coq - Coq:帮助形式化一个非正式的证明
- swagger - 如何从配置文件中设置 swagger 配置属性
- java - 如何在 IntelliJ 中附加 gradle-api 源
- javascript - 使用 .innerHTML 从 2d arraylist javascript 在 html 上生成表格
- python - 如何检查 Pandas 中的列是否具有不同大小写选择的字符串?
- python - 这个 Python 程序不工作,他们没有明显的原因
- python - pickle.load() 在 linux debian 9 中不起作用
- ios - 子容器的约束