Javascript 使用for循环将数据从一个Google工作表映射到另一个

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

我对谷歌脚本还是相当陌生的。我有一个学生名册谷歌表与人口统计信息,包括身份证号码。我还有一个回复表,可以自动收集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++;

    }
  }
}
函数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”列相同
  • 您希望使用谷歌应用程序脚本实现这一点
如果我的理解是正确的,那么这个答案呢?请把这看作是几个可能的答案之一

此修改脚本的流程如下所示

  • 从“响应表”中检索列“B”的值
  • 从“花名册表”中检索值
  • 创建用于搜索ID的对象
  • 将结果值创建为数组
  • 将值放入“响应表”
  • 修改脚本: 参考:

    您能否提供一份样本电子表格,包括复制
    情况的脚本?我只能正确地映射响应表中的第一行;从第二行开始,我只看到数字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);
    }