【问题标题】:How Can I Use setValue() Based Off Of 2 Arrays That Match Value?如何使用基于 2 个匹配值的数组的 setValue()?
【发布时间】:2018-06-24 07:32:52
【问题描述】:

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

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

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

这是另一个选项卡“唯一数据库!”的样子:

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

谢谢!

【问题讨论】:

    标签: javascript google-apps-script


    【解决方案1】:

    你可以试试这个功能:

    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;  
    }
    

    【讨论】:

      【解决方案2】:

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

       =QUERY(Sheet1!A1:B3,"SELECT B WHERE A ='"&E2&"'",0)
      

      查询的第一部分是查找唯一的数据库数据。第二部分选择唯一数据库数据中的 B 列,其中 A 列等于表单响应数据中的数据库名称。请注意,此查询位于响应数据的 F 列中。

      使用代码的另一种替代方法可能是 like this. 运行下面的代码。

      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;
      }
      

      【讨论】:

      • 嘿@Jason,所以我正在尝试记录当时存在的值。数据库管理器会随着时间而改变,因此使用公式意味着不会捕捉到任何历史变化。这也是我的第一个想法,也是我使用 index(match()) 的原因。但是,如果在提交表单时 Person 1 Managed Database 1,我正在尝试记录该值。这样,如果明天 Person 2 切换到 Database 1,它不会影响该表单提交。
      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2022-11-13
      • 2015-08-14
      • 2019-03-18
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多