【发布时间】: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++;
}
}
}
【问题讨论】:
-
您能否提供一个示例电子表格,包括用于复制
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