如何使用Google Apps脚本在Google电子表格中执行查找/过滤

时间:2013-10-04 01:12:35

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

我想使用Google Apps脚本填充包含来自其他电子表格的过滤数据的电子表格。

源文档是员工列表(列A,NAME),报告的小时数(列B,HOURS),他们正在处理的项目(C列,PROJECT)及其特定任务(D列,任务)。

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

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

对不起,我没有代码。我试图独自解决这个问题让我无处可去。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是一个稍微陈旧的帖子,但是如何做到这一点的例子很少,我认为还有一个不会受到伤害。您可以将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;

}; 
};