Как быстрее изменить позицию массива pu sh в массиве - PullRequest
0 голосов
/ 29 мая 2020

У меня есть данные электронной таблицы Google в виде массива. Теперь я хочу pu sh позицию массива, которую я использовал для l oop, который отлично работает с небольшими данными, но когда длина данных увеличивается, это приводит к задержке. Есть ли более быстрый способ pu sh позиции массива в массиве.

Вот код, который я сейчас использую: -

 var ss = SpreadsheetApp.openById('19zxxxxxxxxxxxxxxxxxxxxxxxxOI');
 var sheet1 = ss.getSheetByName('Sheet2');
 var data = sheet1.getRange("A:H").getValues();
 var email = Session.getActiveUser().getEmail();

  for(var i = 0; i < data.length; i++) 
  {
  data.unshift(i+1);
 } // this for loop takes too much time.

  data = data.filter(function(item){return item[7] == email});


  var x = data.map(function(val){
    return val.slice(0, -7);
 }) 
  Logger.log(x)
  return x;

}

1 Ответ

1 голос
/ 30 мая 2020

Я считаю, что ваша цель следующая.

  • Если data.unshift(i+1) равно data[i].unshift(i+1) как Комментарий Мастера , вы хотите получить значения столбца «A», когда значение столбца «G» такое же, как у email. В этот момент вы хотите добавить номер строки к первому индексу значения строки.
    • Из вашего скрипта я понял вот так.
  • Вы хотите снизить стоимость процесса в этой ситуации.

Для этой проблемы как насчет этого решения?

Шаблон 1:

В этом шаблоне ваш скрипт изменен. В этом случае значения результатов извлекаются одним l oop.

Пример сценария:

function myFunction() {
  var ss = SpreadsheetApp.openById('19zxxxxxxxxxxxxxxxxxxxxxxxxOI');
  var sheet1 = ss.getSheetByName('Sheet2');
  var data = sheet1.getRange("A1:H" + sheet1.getLastRow()).getValues();  // Modified
  var email = Session.getActiveUser().getEmail();

  const res = data.reduce((ar, [a,,,,,,g], i) => {  // Modified
    if (g == email) ar.push([i + 1, a]);
    return ar;
  }, []);

  Logger.log(res)
  return res;
}

Шаблон 2:

В этом шаблоне, как и в другом методе , Используются TextFinder и Sheets API. В этом случае размер базовых данных при поиске email с помощью TextFinder можно уменьшить. И каждое значение извлекается одним вызовом API с использованием Sheets API.

Пример сценария:

Перед тем, как использовать этот сценарий, включите Sheets API в расширенных службах Google .

function myFunction() {
  const spreadsheetId = '19zxxxxxxxxxxxxxxxxxxxxxxxxOI';
  const ss = SpreadsheetApp.openById(spreadsheetId);
  const sheet = ss.getSheetByName('Sheet2');
  const email = Session.getActiveUser().getEmail();

  // 1. Retrieve the ranges of rows by searching "email" at the column "G".
  const ranges = sheet.getRange("G1:G" + sheet.getLastRow()).createTextFinder(email).findAll();

  // 2. Create an object for using with Sheets API.
  const reqs = ranges.reduce((o, e) => {
    const row = e.getRow();
    o.rows.push(row);
    o.ranges.push("A" + row);
    return o;
  }, {rows: [], ranges: []});

  // 3. Retrieve values and add the row number.
  const res = Sheets.Spreadsheets.Values.batchGet(spreadsheetId, {ranges: reqs.ranges})
    .valueRanges
    .map((e, i) => ([reqs.rows[i], e.values[0][0]]));

  Logger.log(res)
  return res;
}
  • Если email включена в другую строку, используйте matchEntireCell(true) для TextFinder.

Ссылки:

...