Отказ от ответственности Я новичок в программировании, а также не очень хорошо говорю по-английски, поэтому, пожалуйста, извините за мое плохое объяснение.
У меня есть этот код:
function SearchAttributebyName(ID){
var SheetDatabase = SpreadsheetApp.openById("SS ID");
var Sheet = SheetDatabase.getSheetByName("Sheet1");
var Cell = Sheet.getRange("A3:A");
var Value = Cell.getValues().map(x => x[0]);
Logger.log(Value.length);
Value.forEach((elements, i) => {
if (elements == ID) {
let baris = i + 3;
let name = Sheet.getRange(baris,1,1,1).getValues();
let A= Sheet.getRange(baris,15,1,1).getValues();
let B= Sheet.getRange(baris,16,1,1).getValues();
let C= Sheet.getRange(baris,17,1,1).getValues();
let D= Sheet.getRange(baris,4,1,1).getValues();
let E= Sheet.getRange(baris,21,1,1).getValues();
let F= Sheet.getRange(baris,22,1,1).getValues();
let G= Sheet.getRange(baris,11,1,1).getValues();
let H= Sheet.getRange(baris,12,1,1).getValues();
let I= Sheet.getRange(baris,7,1,1).getValues();
let J= Sheet.getRange(baris,8,1,1).getValues();
let K= Sheet.getRange(baris,9,1,1).getValues();
let L= Sheet.getRange(baris,27,1,1).getValues();
let M= Sheet.getRange(baris,5,1,1).getValues();
return "✅ DATA OF " + name + ": " + "\n" + "\n" +
"DataA : " + A+ "\n" +
"DataB : " + B + "\n" +
"DataC : " + C + "\n" +
"DataD : " + D + "\n" +
"DataE : " + E + "\n" +
"DataF : " + F + "\n" +
"DataG : " + G + "\n" +
"DataH : " + H + "\n" +
"DataI: " + I + "\n" +
"DataJ : " + J + "\n" +
"DataK : " + K + "\n" +
"DataL : " + L + "\n" +
"DataM : " + M;
}
return "DATA NOT FOUND";
});
}
function trythebot() {
Logger.log(SearchAttributebyODPName("XXXXXXX"));
}
Это отлично работает, когда я проверяю функцию SearchAttributebyName
с помощью Logger.log
. Но когда я проверяю функцию SearchAttributebyName
с помощью функции trythebot
, я продолжаю получать результат null
. пожалуйста помоги.
Вам нужно небольшое изменение, SearchAttributebyName
на самом деле ничего не возвращает, потому что сам цикл forEach
не имеет оператора возврата.
Вот возможный подход
function SearchAttributebyName(ID) {
var SheetDatabase = SpreadsheetApp.openById("SS ID");
var Sheet = SheetDatabase.getSheetByName("Sheet1");
var Cell = Sheet.getRange("A3:A");
var Value = Cell.getValues().map((x) => x[0]);
Logger.log(Value.length);
let result;
Value.forEach((elements, i) => {
if (elements == ID) {
let baris = i + 3;
let name = Sheet.getRange(baris, 1, 1, 1).getValues();
let A = Sheet.getRange(baris, 15, 1, 1).getValues();
let B = Sheet.getRange(baris, 16, 1, 1).getValues();
let C = Sheet.getRange(baris, 17, 1, 1).getValues();
let D = Sheet.getRange(baris, 4, 1, 1).getValues();
let E = Sheet.getRange(baris, 21, 1, 1).getValues();
let F = Sheet.getRange(baris, 22, 1, 1).getValues();
let G = Sheet.getRange(baris, 11, 1, 1).getValues();
let H = Sheet.getRange(baris, 12, 1, 1).getValues();
let I = Sheet.getRange(baris, 7, 1, 1).getValues();
let J = Sheet.getRange(baris, 8, 1, 1).getValues();
let K = Sheet.getRange(baris, 9, 1, 1).getValues();
let L = Sheet.getRange(baris, 27, 1, 1).getValues();
let M = Sheet.getRange(baris, 5, 1, 1).getValues();
result = (
"✅ DATA OF " +
name +
": " +
"\n" +
"\n" +
"DataA : " +
A +
"\n" +
"DataB : " +
B +
"\n" +
"DataC : " +
C +
"\n" +
"DataD : " +
D +
"\n" +
"DataE : " +
E +
"\n" +
"DataF : " +
F +
"\n" +
"DataG : " +
G +
"\n" +
"DataH : " +
H +
"\n" +
"DataI: " +
I +
"\n" +
"DataJ : " +
J +
"\n" +
"DataK : " +
K +
"\n" +
"DataL : " +
L +
"\n" +
"DataM : " +
M
);
}
});
return result || "DATA NOT FOUND";
}
Метод Array.forEach() принимает функцию и запускает эту функцию для каждого элемента в массиве, который вы итерируете. Оператор return
в функции просто позволяет .forEach()
перейти к следующему элементу. Возвращаемое значение никуда не передается.
Вы можете заставить код работать, используя вместо этого Array.map()
, например:
function test() {
console.info(searchAttributebyName('XXXXXXX'));
}
function searchAttributebyName(name) {
const sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
const indices = [1, 15, 16, 17, 4, 21, 22, 11, 12, 7, 8, 9, 27, 5]
.map(index => index - 1);
return sheet.getRange('A3:AA').getValues()
.filter(row => row[0] === name)
.map(row => reorderRow_(row, indices))
.map(row => row.map((value, index) => `Data${index + 1}: ${value}`))
.map(row => row.join('\n'))
.join('\n\n') || `(no row matches ${name})`;
}
/**
* Returns a copy of a 1D array with values rearranged by indices
* and sliced to indices.length.
*
* @param {Object[]} row The row to rearrange.
* @param {Number[]} indices The indices to use when the
* @return {Object[]} The rearranged row with length adjusted to indices.length.
*/
function reorderRow_(row, indices) {
// version 1.0, written by --Hyde, 23 January 2022
// - see https://stackoverflow.com/q/75206328/13045193
return indices.map(index => row[index]);
}