Я считаю, что ваша цель следующая.
- Если
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.
Ссылки: