【问题标题】:How to Perform a Lookup/Filter Across Google Spreadsheets Using Google Apps Script如何使用 Google Apps 脚本在 Google 电子表格中执行查找/过滤
【发布时间】:2013-10-04 01:12:35
【问题描述】:

我想使用 Google Apps 脚本用来自另一个电子表格的过滤数据填充电子表格。

源文档是一份员工列表(A 列,姓名),以及他们报告的工时(B 列,HOURS)、他们正在从事的项目(C 列、PROJECT)以及他们的具体任务(D 列、任务)。

我想用相同的信息填充第二个电子表格,但仅限于 PROJECT 等于“Project X”且 Task 等于“Task 1”或“Task 2”的地方。

我知道如何在源文档中没有脚本的情况下执行此操作,但 Google 电子表格不允许 VLookup 或我知道的任何其他查找函数跨单独文档查找值。在这种情况下,使用 ImportRange 将源数据导入第二个电子表格不起作用,因为源数据太大(最终,由于一个电子表格的数据太多,因此必须更改此脚本以查看多个源文档)。

对不起,我没有代码。我自己解决这个问题的尝试没有得到任何结果。

谢谢!

【问题讨论】:

  • 你应该把你的问题分解成更小的问题。首先尝试编写一个脚本,将所有数据从一个电子表格复制到另一个。然后包含一个过滤器以仅复制与 Col A 中的特定值匹配的那些,依此类推...当您这样做时,如果您遇到困难,请随时返回 SO,无论您尝试过什么,社区都会帮助。但是,如果您正在寻找现成的代码,很遗憾这不是这个地方
  • 谢谢,这很有帮助。我试图学习 javascript 只是为了回答这个问题,但它进展缓慢。基本上,我搜索了 Google 电子表格上的资源,每个人都说这是一个需要使用 Apps Script 解决的问题。试图打破如何在 Apps 脚本中真正做到这一点一直把我带到这里。

标签: filter google-apps-script gs-vlookup


【解决方案1】:

简短的回答:你不能,特别是如果数据很大。 您可能可以使用脚本(使用 vlookup 或查询)编写公式,但这有局限性,例如,如果多个脚本同时运行,您必须轮流执行。 另一种更强大的方法是将 urlfetch 与电子表格 api 一起使用。使用带有“q”过滤器的列表行 API。即使是同时运行的脚本也能很好地工作。

【讨论】:

    【解决方案2】:

    这是一个有点旧的线程,但是关于如何做到这一点的例子太少了,我认为再多一个也不会受到伤害。您可以将 SQL 语句传递到下面的 querySpreadsheet() 函数中,例如:

    var querySQL = "SELECT A, B, C, D WHERE C = 'Project X' AND (D = 'Task 1' OR D = 'Task 2')";
    

    然后,您可以将函数返回的数据数组拖放到目标工作表中,如下所示:

    var aryValues = querySpreadsheet(querySQL);
    SpreadsheetApp.getActiveSpreadsheet().getRangeByName('OUTPUT_TOPLEFT_CELL').offset(0, 0, aryValues.length, 4).setValues(aryValues);
    

    这些功能几乎可以使用,只需在指示处替换您的信息即可。 感谢 Mogsdad 提供此脚本的原件: Using QUERY URL to group data before sending to Google Apps Script dashboard

    function querySpreadsheet(querySQL){ 
    
    try {  
    
      //you can find both these items in the url of your spreadsheet
      var ssKey = 'DOCUMENT KEY OF THE DATA SOURCE SPREADSHEET INSIDE THESE QUOTES - long code ends with "&" starts with "key="';
      var gId = 'INDEX OF THE SHEET CONTAINING THE DATA - starts with "gid="';
      var query = encodeURIComponent(querySQL);
    
      var url = 'http://spreadsheets.google.com/tq?key=%KEY%&gid=%GID%&tq=%QUERY%'
      .replace('%KEY%',ssKey)
      .replace('%QUERY%',query)
      .replace('%GID%',gId);
    
      var response = UrlFetchApp.fetch(url);
      var content = response.getContentText();    
      var jsonContent = getJSON(content);
    
      var numCols = jsonContent.table.cols.length;
      var numRows = jsonContent.table.rows.length;
    
      // Decode objectContent into a two-dimensional array.
      var mydata = [];
      // Then data rows
      for (var row = 0; row < numRows; row++) {
        mydata[row] = [];
        for (var col = 0; col < numCols; col++ ) {
          mydata[row].push(jsonContent.table.rows[row].c[col].v);
        }
      }
    
      return mydata;
    
    }  catch(error) {
      Logger.log('querySpreadsheet: ERROR - ', error);
    };    
    };
    
    //the content text format is not uniform; try 2 methods to return a JSON object 
    function getJSON(contentText) {
    
    try {  
    
      var regex = /.*google.visualization.Query.setResponse\((.*)\)/g    
      var ret = eval('('+ regex.exec(contentText)[1] +')');
      return ret;
    
    }  catch(error) {
    
      var ret = regex.exec(contentText)[1];
      var ret = Utilities.jsonParse(ret);
      return ret;
    
    }; 
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多