0

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

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

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

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

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

谢谢!

4

2 回答 2

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 提供此脚本的原始版本: 在发送到 Google Apps 脚本仪表板之前使用 QUERY URL 对数据进行分组

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;

}; 
};
于 2014-02-16T09:51:04.180 回答
0

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

于 2013-10-04T02:37:31.330 回答