根据目标电子表格的“电子邮件”标签中提供的电子邮件,从源工作表中获取数据

时间:2020-05-13 21:20:31

标签: google-apps-script google-sheets

我有两张纸的问题。一张是source spreadsheet,另一张是目标电子表格。源电子表格具有一个源表单,该表单具有主数据库,target spreadsheet的目标是我们要根据目标电子表格的“电子邮件”标签中提供的电子邮件从源表单中获取数据的目标。

我希望脚本执行以下操作,而不是IMPORTRANGE或QUERY:

目标电子表格将具有多个副本,因此我想根据源电子表格的ID将目标电子表格与源电子表格连接起来。

我希望电子邮件匹配不区分大小写,以便目标电子表格的用户在任何情况下都可以键入电子邮件。

电子邮件最多可以增加50条,或者说获得该列的最后一行。

如果脚本在提取数据后显示一个弹出式提示说“更新”,那就太好了。

源工作表可能包含多达15000行的数据,因此我也在考虑速度。

我共享了两个电子表格,并带有指向其名称的超链接。我不太擅长脚本,因此如果您可以在任意位置留下评论,将会很有帮助。非常感谢您的帮助。

谢谢!

此处脚本:

function fetch() {
  //get the sheets
  var source_Ssheet = SpreadsheetApp.openById('19FkL3rsh5sxdujb6x00BUPvXEEhiXfAeURTeQi3YWzo');
  var target_Ssheet = SpreadsheetApp.getActiveSpreadsheet();

  //get the tabs
  var email_sheet = target_Ssheet.getSheetByName("Emails");
  var target_sheet = target_Ssheet.getSheetByName("Target Sheet");
  var source_sheet = source_Ssheet.getSheetByName("Source Sheet");

  //get ranges
  var email_list = email_sheet.getRange("B2:B");
  var target_sheet_range = target_sheet.getRange("A1:F100");
  var source_sheet_range = source_sheet.getRange("A1:F100");

  //get last rows
  var last_email_name = email_list.getLastRow();
  var last_target_sheet_range = target_sheet_range.getLastRow();
  var last_source_sheet_range = source_sheet_range.getLastRow();

  //start searching for emails
  for (var i=3; i < last_email_name.length+1; i++)
  {
    for(varj=3; j< last_source_sheet_range.length+1; j++ )
    {
        if(source_sheet_range[j][3].getValue() == email_list[i][3].getValue())
        {
          //copy matches to target sheet
          target_sheet.getRange((last_target_sheet_range + 1),1,1,10).setValues(master_sheet_range[j].getValues()); 
        }

    }
  }
}

1 个答案:

答案 0 :(得分:0)

几件事

  1. last_email_namelast_source_sheet_range是数字-它们没有长度,这就是为什么您的第一个for循环不起作用的原因
  2. 您在varj=3;中缺少空格
  3. email_list[i][3].getValue()不存在,因为email_list仅包含B-仅包含一列。我想你是说email_list[i][0].getValue()
  4. 范围不能用索引[][]寻址,您需要首先检索值以具有2D值范围。
  5. 您通过电子邮件发送不同工作表中的值的情况不一样。 Apps脚本区分大小写,要起诉==比较,您需要使用toLowerCase()方法。
  6. 还请注意,定义getRange("B2:B")会包含许多不需要的空行,这会使您的代码非常慢。通过getRange("B2:B" + email_sheet.getLastRow());
  7. 替换它

在这里查看调试后的代码-请记住,仍有很大的改进空间。

function fetch() {
  //get the sheets
  var source_Ssheet = SpreadsheetApp.openById('19FkL3rsh5sxdujb6x00BUPvXEEhiXfAeURTeQi3YWzo');
  var target_Ssheet = SpreadsheetApp.getActiveSpreadsheet();

  //get the tabs
  var email_sheet = target_Ssheet.getSheetByName("Emails");
  var target_sheet = target_Ssheet.getSheetByName("Target Sheet");
  var source_sheet = source_Ssheet.getSheetByName("Source Sheet");

  //get ranges
  var email_list = email_sheet.getRange("B2:B" + email_sheet.getLastRow()).getValues();
  var target_sheet_range = target_sheet.getRange("A1:F100").getValues();
  var source_sheet_range = source_sheet.getRange("A1:F100").getValues();
  var last_target_sheet_range = target_sheet.getLastRow();
  //start searching for emails
  for (var i=1; i < email_list.length; i++)
  {
    for(var j=1; j< source_sheet_range.length; j++ )
    {
        if(source_sheet_range[j][0].toLowerCase() == email_list[i][0].toLowerCase())
        {
          target_sheet.getRange((last_target_sheet_range + 1),1,1,6).setValues([source_sheet_range[j]]); 
        }
    }
  }
}
相关问题