Javascript 使用for循环将数据从一个Google工作表映射到另一个
我对谷歌脚本还是相当陌生的。我有一个学生名册谷歌表与人口统计信息,包括身份证号码。我还有一个回复表,可以自动收集B列的电子邮件地址(电子邮件地址由ID号加上“@foo.org”创建)。我试图让我的脚本通过自动收集的电子邮件进行解析,将电子邮件的ID部分映射到C列。然后我使用for循环检查提取的ID号与我的主花名册,并将同一学生的剩余信息映射到响应表上 到目前为止,我只能正确地映射响应表中的第一行;从第二行开始,我只看到数字ID,但它没有映射其他相关列。这就是我目前拥有的:Javascript 使用for循环将数据从一个Google工作表映射到另一个,javascript,for-loop,google-apps-script,google-sheets,mapping,Javascript,For Loop,Google Apps Script,Google Sheets,Mapping,我对谷歌脚本还是相当陌生的。我有一个学生名册谷歌表与人口统计信息,包括身份证号码。我还有一个回复表,可以自动收集B列的电子邮件地址(电子邮件地址由ID号加上“@foo.org”创建)。我试图让我的脚本通过自动收集的电子邮件进行解析,将电子邮件的ID部分映射到C列。然后我使用for循环检查提取的ID号与我的主花名册,并将同一学生的剩余信息映射到响应表上 到目前为止,我只能正确地映射响应表中的第一行;从第二行开始,我只看到数字ID,但它没有映射其他相关列。这就是我目前拥有的: function ex
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++;
}
}
}
函数extractId(){
var responsesheet=SpreadsheetApp.openById('XXXXXXX').getSheetByName('Sheet1');
var rosterSheet=SpreadsheetApp.openById('XXXXXXX').getSheetByName('Sheet1');
var responsesHighestEntry=responseSheet.getLastRow();
var电子邮件;
变量ID号;
var rosterLastRow=rosterSheet.getLastRow();
var rosterArray=rosterSheet.getRange(2,1,(rosterLastRow-1)).getValues();
var studentResponsesRow;
var i;
var x;
变量y=2;
var全名;
var等级;
var咨询师;
var咨询室;
对于(i=2;i
带有人口统计数据的样本名册表
最终结果回复表样本。在这种情况下,将自动收集电子邮件地址。C-G列将是运行脚本的结果 - 您希望从问题图像中的“花名册表”值中获得“最终结果响应表样本”。
- 在您的情况下,“回复表”只有包含电子邮件地址的“B”列
- 您希望将来自电子邮件地址的ID值与“花名册表”中的“A”列相同
- 您希望使用谷歌应用程序脚本实现这一点
情况的脚本?我只能正确地映射响应表中的第一行;从第二行开始,我只看到数字ID,但它没有映射其他相关列。
?当然,请删除您的个人信息。顺便说一下,在您的脚本中,ID似乎是从电子邮件中检索到的。但是直接从列“C”中检索它怎么样?第二个图像是执行脚本的图像。第一个for循环的第一部分从电子邮件中提取ID,并在C列上设置值。然后,在第二个for循环中,我试图对照花名册表(第一张图像)交叉检查该ID,然后将数据映射到响应行中的相关列。该脚本包括将全名映射到第二个图像的D列。出于工作保密的原因,我不能提供图片以外的样本。谢谢您的回复。我理解您不能提供电子表格样本。您能提供复制about的方法吗?我只能正确映射响应表中的第一行…
?因为虽然我准备了图像的样本表,但我无法使用更新的脚本复制您的情况。所以我认为图像样本可能与实际格式不同。顺便说一下,在您的脚本中,ID似乎是从电子邮件中检索到的。但是直接从“C”列检索它怎么样?如果我误解了你的情况,我道歉。谢谢你的回复。上面脚本的第29-42行映射了原始文件中的内容。在我最初的设置中,第二个图像只有B列。目的是第二个for循环检查从电子邮件中提取的ID与花名册,并将数据映射到响应表上。(他的总体想法是将谷歌表单设置为自动收集电子邮件。回复表(即第二张图片)将有B列,然后脚本根据准确的数据生成C-G列。在循环的第一次迭代后,我遇到了问题。谢谢你的回答。我认为我可以理解你的目标。因此我提出了一个修改脚本作为答案。你能确认一下吗?如果我误解了你的问题,那不是对于您想要的结果,我深表歉意。感谢您的跟进,我收到了错误无法将数组转换为数字[][](第11行,文件“code”)
@gonzalo2000感谢您的回复。对于由此带来的不便,我深表歉意。尽管我已经准备了示例scr
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);
}