Javascript 如何使用基于两个匹配值的数组的setValue()?

Javascript 如何使用基于两个匹配值的数组的setValue()?,javascript,google-apps-script,Javascript,Google Apps Script,我应该首先让你知道我是JS方面的一个极端新手。我的背景几乎完全是SQL/VBA。因此,无论是在编码方面还是在堆栈溢出方面,您所提供的任何提示都将不胜感激 问题背景: 我有一个脚本,用于从Google表单响应发送出站电子邮件,托管在Google工作表中,并设置为OnFormResponse()。通常,我只被要求从HTML模板电子邮件中的表单响应返回特定的信息。然而,我现在的业务案例是,我需要从另一个表中查找值,其中相邻列的值与表单响应值匹配。使用匹配的值,我需要在表单响应表中设置特定列/行(F:F

我应该首先让你知道我是JS方面的一个极端新手。我的背景几乎完全是SQL/VBA。因此,无论是在编码方面还是在堆栈溢出方面,您所提供的任何提示都将不胜感激

问题背景: 我有一个脚本,用于从Google表单响应发送出站电子邮件,托管在Google工作表中,并设置为OnFormResponse()。通常,我只被要求从HTML模板电子邮件中的表单响应返回特定的信息。然而,我现在的业务案例是,我需要从另一个表中查找值,其中相邻列的值与表单响应值匹配。使用匹配的值,我需要在表单响应表中设置特定列/行(F:F)的值

示例: 以下是表单响应表的简化版本,以及我通常使用的公式:

下面是另一个选项卡“唯一数据库!”,看起来像:

因此,我对JavaScript数组的理解是,在表单响应表中,我会将所有列(本例中为A:E)加载到一个变量中,并获取值。然后,获取“唯一数据库!”的A:B列,将这些值加载到另一个数组中。如果这是正确的,那么如何将1个数组的索引与另一个数组的索引进行比较,并返回相邻的匹配


谢谢

我不确定您是否需要使用应用程序脚本来进行这样的比较。也许更快的方法是在工作表中使用查询。可能是这样的:

 =QUERY(Sheet1!A1:B3,"SELECT B WHERE A ='"&E2&"'",0)
查询的第一部分是查找唯一的数据库数据。第二部分选择unique databases data中的B列,其中A列等于表单responses data中的数据库名称。请注意,此查询位于响应数据的F列中

另一种使用代码的方法可能是运行下面的代码

function getFormData(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet2');
  var getRange = sheet.getRange('E2:E');
  var data = getRange.getValues();
  var lookup = getLookupData();
  data.forEach(function(item,index){
    sheet.getRange(index + 2 , 6).setValue(lookup[item])
  })

}

function getLookupData() {
  var obj = {};
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet1');
  var range = sheet.getRange('A2:B6');
  var data = range.getValues();
  data.forEach(function(item){
    obj[item[0]] = item[1];    
  })
  Logger.log(obj)
  return obj;
}

我不确定您是否需要使用应用程序脚本来进行这样的比较。也许更快的方法是在工作表中使用查询。可能是这样的:

 =QUERY(Sheet1!A1:B3,"SELECT B WHERE A ='"&E2&"'",0)
查询的第一部分是查找唯一的数据库数据。第二部分选择unique databases data中的B列,其中A列等于表单responses data中的数据库名称。请注意,此查询位于响应数据的F列中

另一种使用代码的方法可能是运行下面的代码

function getFormData(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet2');
  var getRange = sheet.getRange('E2:E');
  var data = getRange.getValues();
  var lookup = getLookupData();
  data.forEach(function(item,index){
    sheet.getRange(index + 2 , 6).setValue(lookup[item])
  })

}

function getLookupData() {
  var obj = {};
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Sheet1');
  var range = sheet.getRange('A2:B6');
  var data = range.getValues();
  data.forEach(function(item){
    obj[item[0]] = item[1];    
  })
  Logger.log(obj)
  return obj;
}

您可以尝试以下功能:

function dbmanager(dbname) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Unique Databases!');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var r='';
  for(var i=0;i<vA.length;i++){
    if(dbname==vA[i][0]){
      r=vA[i][1];
      break;
    }
  }
  return r;  
}
函数dbmanager(dbname){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Unique Databases!');
var rg=sh.getDataRange();
var vA=rg.getValues();
var r='';

对于(var i=0;i您可以尝试此函数:

function dbmanager(dbname) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Unique Databases!');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var r='';
  for(var i=0;i<vA.length;i++){
    if(dbname==vA[i][0]){
      r=vA[i][1];
      break;
    }
  }
  return r;  
}
函数dbmanager(dbname){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Unique Databases!');
var rg=sh.getDataRange();
var vA=rg.getValues();
var r='';

对于(var i=0;iHey@Jason,因此我尝试记录当时存在的值。数据库管理器可以随时间变化,因此使用公式意味着不会捕获任何历史更改。这也是我的第一个想法,也是我为什么使用index(match())。但是,如果Person 1在表单提交时管理数据库1,我将尝试记录该值。这样,如果Person 2明天切换到数据库1,则不会影响表单提交。嘿@Jason,所以我尝试记录当时存在的值。数据库管理器可以随时间而更改,因此使用formula意味着不会捕获任何历史性更改。这也是我的第一个想法,也是我使用索引(match())的原因。但是,如果Person 1在表单提交时管理数据库1,我将尝试记录该值。这样,如果Person 2明天切换到数据库1,则不会影响表单提交。