Vlookup + indexOf 通过 Google App 脚本在 CSV 中查找值而不使用循环

Vlookup + indexOf to find values in a CSV via Google App Script without using loop

主要思想是不需要循环生成 VLOOKUP 因为当数据量很大时它会产生巨大的减速。

直接在sheet中对数据进行VLOOKUP我是这样操作的:

function myFunction() {
  var s = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();     
  var searchValue = s.getRange("Test!A1").getValue();
  var data = SpreadsheetApp.openById("XXXXXXXXXXXX").getSheetByName("Test 2");
  var dataValues = data.getRange("A1:A").getValues();
  var dataList = dataValues.join("ღ").split("ღ");
  var index = dataList.indexOf(searchValue);
  
  if (index === -1) {
    s.getRange("Test!B1").setValue('off');
  } else {
    var row = index + 1;
    var foundValue = data.getRange("D"+row).getValue();
    s.getRange("Test!B1").setValue(foundValue);
  }
}

但是这个方法有一个很大的问题,因为当很多不同的账户试图同时访问这个sheet时,有时会出现错误type error: could not connect sheet xxxxx或者造成巨大的延迟。

那么我找到的解决方案是什么?将 spreadsheet 页面发布为 CSV 格式以便使用,并且当许多帐户调用相同的 spreadsheet.

时不会发生此错误

目前,当我导入包含多列数据的 CSV 时,我还没有找到使用第一列的 indexOf 方法,所以我只能创建一个 spreadsheet 页面使用 A 列的复制数据,然后我得到了 VLOOKUP 的最终结果,如下所示:

(在本例中 var searchValue 中的值将是 two

function myFunction() {
  var s = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  var url_columnA = 'AAAAA';
  var url_vlookup = 'BBBBB';
  
  var dataSearch = Utilities.parseCsv(UrlFetchApp.fetch(url_columnA));
  var dataList = dataSearch.join("ღ").split("ღ");
  var searchValue = s.getRange("Test!A1").getValue();
  var index = dataList.indexOf(searchValue);

  if (index === -1) {
    s.getRange("Test!B1").setValue('off');
  } else {
    var row = index;
    var dataVlookup = Utilities.parseCsv(UrlFetchApp.fetch(url_vlookup));
    var foundValue = dataVlookup[row][3];
    s.getRange("Test!B1").setValue(foundValue);
  }
}

Return 例子:

other number

var url_vlookup:

Col A Col B Col C Col D
home 1 a win
away 2 b loose
one 3 c number
two 4 d other number
three 5 e number again?

var url_columnA:

Col A
home
away
one
two
three

有没有什么方法可以处理 var url_vlookup 数据以搜索 A 列中的值,这样就不必使用此页 var url_columnA 分隔,或者这是不循环的唯一方法?

使用 Array.map:

解析后可以很容易地分隔第一列
const dataVlookup = Utilities.parseCsv(UrlFetchApp.fetch(url_vlookup));
const url_columnA = dataVlookup.map(row => row[0])