Я использую приведенный ниже код, чтобы проверить, соответствует ли входное значение какому-либо значению столбца листа Google.
Средство ведения журнала возвращает массив всех телефонных номеров в указанном столбце, но цикл for работает только для первого номера телефона в массиве. А также буду признателен, если подскажете, как добиться тех же результатов с помощью if (allNumbers.flat().indexOf(newPhone) != -1)
и какой способ лучше.
function phoneSearch(newPhone) {
try {
var ss = SpreadsheetApp.openByUrl("URL");
var sheet = ss.getSheetByName("sheet name");
var allNumbers = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1).getDisplayValues();
Logger.log(allNumbers.length);
for (var i = 0; i < allNumbers.length; i++) {
if (allNumbers[i][0] == newPhone) {
var result = "not available"
} else {
var result = "available"
};
return result;
}
} catch (e) {}
}
Потому что со стороны клиента я использую обработчик onsuccess: function onSuccess(result) { if (result == "not available") { Do something } else { Do something } }
поэтому мне нужно вернуть результат цикла for на стороне сервера, чтобы завершить действие на стороне клиента. Спасибо @Jaromanda X
да, но ваш код всегда возвращает значение из цикла for, поэтому вы не выполняете цикл более одного раза - никогда - это то, что делает return, он возвращает значение из функции
Да, я понял проблему, но не могу найти другого способа получить то, что хочу. Я пытался сгладить массив и использовать индекс, но тоже безуспешно. Любые идеи, буду очень благодарен
Ваша функция всегда возвращает результат с первой итерации цикла. Возвращать следует только в том случае, если номер занят, а если нет, продолжайте проверять другие номера.
function phoneSearch(newPhone){
try {
var ss = SpreadsheetApp.openByUrl("URL");
var sheet = ss.getSheetByName("sheet name");
var allNumbers = sheet.getRange(2,2,sheet.getLastRow() -1,1).getDisplayValues();
Logger.log(allNumbers.length);
for (var i = 0; i < allNumbers.length; i++) {
if (allNumbers[i][0] == newPhone) {
return "not available"
}
}
// If "not available" wasn't returned from the loop, the number is avialable
return "available";
} catch(e) {
// Probably need some more robust treatment here
}
}
большое спасибо. Теперь я понимаю, почему цикл for остановился на первом элементе.
Другие на этой странице объяснили, что ваш цикл возвращается после одной итерации.
Array.flat — полезный способ делать то, что вы хотите.
Это так же просто, как
function phoneSearch(newPhone) {
try {
var ss = SpreadsheetApp.openByUrl("URL");
var sheet = ss.getSheetByName("sheet name");
var allNumbers = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1).getDisplayValues();
return allNumbers.flat().includes(newNumber) ? 'not available' : 'available';
} catch (e) {}
}
Если вас беспокоит время выполнения, вам действительно следует кэшировать значения, возвращаемые с листа.
window.addEventListener('load', () => {
let allNumbers = [];
try { // store the list once
var ss = SpreadsheetApp.openByUrl("URL");
var sheet = ss.getSheetByName("sheet name");
allNumbers = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1).getDisplayValues();
allNumbers = allNumbers.flat();
} catch (e) {}
const numberAvailable = (newPhone) => !allNumbers.includes(newNumber);
const addNumber = (newPhone) {
if (numberAvailable(newPhone)) {
allNumbers.push(newPhone); // update the list used by testing availability
// write allNumbers to sheet or add newNumber
} else {
console.info('Number not available'); // handle existing number
}
};
});
Большое спасибо. Считаете ли вы, что в этом случае сглаживание массива лучше, чем цикл, с точки зрения времени выполнения?
Зависит от размера. Посмотреть обновление
Теперь все ясно. Я не знаю, что сказать, спасибо большое!
Пожалуйста.
вам
return result;
- что завершает цикл - вам следует отформатировать свой код, тогда его будет легко обнаружить