Вы, вероятно, выиграете от изменения вашей процедуры проверки - в настоящее время то, что у вас есть, не масштабируется из-за медленных, повторных вызовов *1002* в службу электронных таблиц. Используйте пакетный метод - getValues()
- чтобы вернуть Javascript Array
, который содержит все содержимое, которое вы могли бы хотеть из своего «основного списка» имен:
// Create an N x 1 array of arrays, e.g. [ [r1c1], [r2c1], [r3c1], ... [rNc1] ],
// of data in column A in sheet2. There will be blanks at the end if other columns have more data.
var allNames = sheet2.getRange(1, 1, sheet2.getLastRow(), 1).getValues();
Чтобы проверить, присутствует ли имя из первого листа, мы можем заменить этот код:
for (var j = 1; j < lastRow1; j++) {
var playerNameSheet2 = sheet2.getRange(j, 1).getValue();
if (playerNameSheet2 == playerNameSheet1) {
/* do stuff */
с этим кодом (примечание j
теперь начинается с 0):
for (var j = 0; j < allNames.length; ++j) {
if (playerNameSheet1 === allNames[j][0]) {
/* do stuff */
Если вам нужно только do stuff
для имени один раз в вызове функции (например, вам не нужно выполнять тело цикла двадцать раз, когда имя листа 1 - "Боб" и там двадцать листов на листе 2), вы можете упростить проверку значения allNames
с помощью метода Array#indexOf
. Во-первых, нужно свернуть «2D» массив массивов значений в массив значений. Мы хотим применить функцию к каждому элементу внешнего массива и создать массив его выходных данных, поэтому мы решили вызвать для него Array#map
:
var db = allNames.map(function (row) { return row[0]; });
Используемая нами функция просто возвращает первый элемент переданного элемента, то есть значение в первом столбце, что приводит к выводу, подобному [ r1c1, r2c1, r3c1, ... rNc1 ]
.
Код замены:
if (db.indexOf(playerNameSheet1) === -1) {
console.log({
message: "Did not find '" + playerNameSheet1 + "' in database.",
database: db, original: allNames, searched: playerNameSheet1
});
return;
}
/* do stuff */
В котором написано «если имя отсутствует на листе 2, зарегистрируйте неудачный поиск и затем прекратите запуск функции.» Для обеспечения фактического ведения журнала журнал отправляется в Stackdriver, который будет хранить его для намного дольше, чем класс Logger
.
Если ваши do stuff
биты используют индекс j
, вы все равно можете получить этот индекс и использовать соответствующую строку на листе 2:
var index = db.indexOf(playerNameSheet1);
if (index === -1) {
console.log({
message: "Did not find '" + playerNameSheet1 + "' in database.",
database: db, original: allNames, searched: playerNameSheet1
});
return;
}
/* do stuff with the user's existing row of data, e.g.
var userDataRow = sheet2.getRange(index + 1, 1, 1, sheet2.getLastColumn()).getValues();
var userData = userDataRow[0];
...
*/
Возможное улучшение модификации indexOf
, которую я оставляю вам для изучения и / или реализации, - это использование Object
для хранения имен в качестве «ключей» (свойств объекта) и индекса связанные листовые данные (или даже данные напрямую) в качестве ассоциированного значения пары ключ-значение.