【问题标题】:How to speed ​up the search data in sheet如何加快工作表中的搜索数据
【发布时间】:2019-06-19 08:23:38
【问题描述】:

我有超过 1000000 条记录如何加快工作表中的搜索速度。我一般搜索20多岁如何提高? (表包括 20 列和 10000 条记录)

var ss =  SpreadsheetApp.openByUrl(urldb);
var ws =  ss.getSheetByName("Account");
var data = ws.getDataRange().getValues();

for(var i = 0; i < data .length; i++){

    if(data [i][1] == "ID998724"){

      Logger.log("found you" + data [i][1]);

    }
};

return data[i][1];

【问题讨论】:

  • 由于您只在第 2 列中查找数据,而不是使用 .getDataRange(),您是否尝试过仅对第 2 列使用 .getRange() 并传递工作表的行数?跨度>
  • 一百万条记录可能应该在数据库中,而不是电子表格中,但无论如何,你能异步获取数据吗?一次请求大约 1,000 或 10,000 条记录,并在下一批下载时搜索前一个。 (这是否更适合Code Review?)
  • @loc dinh 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,可以问一下你现在的情况吗?我想学习解决你的问题。
  • 感谢大家回答我的问题!我想加快查找也获取数据行吧

标签: javascript google-apps-script google-sheets


【解决方案1】:
  • 您想使用 Google Apps 脚本从电子表格中“帐户”表的“B”列中搜索 ID998724 的值。

如果我的理解是正确的,那么这 3 个示例脚本怎么样?请认为这只是几个答案之一。

示例脚本 1:

在这个脚本中,我为这种情况使用了 Class TextFinder。这是在最近的 Google 更新中添加的。

var urldb = "###"; // Please set this.
var searchValue = "ID998724";

var ss = SpreadsheetApp.openByUrl(urldb);
var ws = ss.getSheetByName("Account");
var f = ws.createTextFinder(searchValue).findAll();
if (f.length > 0) {
  for (var i = 0; i < f.length; i++) {
    if (f[i].getColumn() == 2) {
      Logger.log("found you" + f[i].getValue())
    }
  }
}

示例脚本 2:

在此脚本中,值是从“B”列中检索的。 ross's comment 也提到了这一点。而且从基准测试的结果来看,我在这种情况下使用了filter()

var urldb = "###"; // Please set this.
var searchValue = "ID998724";

var ss = SpreadsheetApp.openByUrl(urldb);
var ws = ss.getSheetByName("Account");
var data = ws.getRange(1, 2, ws.getLastRow(), 1).getValues();
var f = data.filter(function(e) {return e[0] == searchValue});
if (f.length > 0) {
  for (var i = 0; i < f.length; i++) {
    Logger.log("found you" + f[i])
  }
}

示例脚本 3:

在这个脚本中,我针对这种情况使用了查询语言。

var urldb = "###"; // Please set this.
var searchValue = "ID998724";

var ss = SpreadsheetApp.openByUrl(urldb);
var ws = ss.getSheetByName("Account");
var query = "select * where B='" + searchValue + "'";
var url = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/gviz/tq?gid=" + ws.getSheetId() + "&tqx=out:csv&tq=" + encodeURIComponent(query);
var options = {headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}};
var csv = UrlFetchApp.fetch(url, options);
var f = Utilities.parseCsv(csv);
if (f.length > 0) {
  for (var i = 0; i < f.length; i++) {
    Logger.log("found you" + f[i][1])
  }
}

注意:

  • 在您的脚本中,我认为return data[i][1] 出现错误。因为idata.length 相同。例如,如果您想通过return data[i][1]检索值,请将break放在Logger.log("found you" + data [i][1])之后。

参考资料:

如果我误解了您的问题并且这些示例脚本不是您想要的结果,我深表歉意。

【讨论】:

  • 您可以向我解释更多示例脚本 3 吗?我不明白 (" var options = {headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}}; var csv = UrlFetchApp.fetch(url, options); var f = Utilities.parseCsv(csv ); ") 怎么办???
  • @loc dinh 感谢您的回复。 1.var options = {headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}} 用于UrlFetchApp。此方法需要使用访问令牌。 2. var csv = UrlFetchApp.fetch(url, options); var f = Utilities.parseCsv(csv) 用于解析从 UrlFetchApp 检索到的值。 Ref 因为结果是以 CSV 数据返回的。
  • @Tannaike 非常感谢。但我有一个问题,我找到了 ID,但我怎样才能记录它(行数据)。因为加快了搜索ID最终是为了获取数据吧。以你的方式只获得 ID
  • @loc dinh 如果您使用样本 3,csvvar csv = UrlFetchApp.fetch(url, options) 是包括具有 searchValue 的行的值。所以当你想要包含searchValue的行时,请将Logger.log("found you" + f[i][1])修改为Logger.log("found you" + f[i])。这样,您可以看到行列表。我对您的回复的理解正确吗?
  • 我将 Logger.log("found you" + f[i][1]) 更改为 Logger.log("found you" + f[i]) 它运行良好,但长度为26 --> 我认为这是 26 列,但我的工作表有 5 列。如果我们解析为 csv,我还有更多问题,所以在 csv 中查找 id 更快?为什么要解析为 csv
猜你喜欢
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
相关资源
最近更新 更多