javascript 如何解决空返回?

ijnw1ujt  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(134)

免责声明我是个编程新手,英语也不太好,所以请原谅我的解释不好。
我有这个代码:

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"));
}

当我用Logger.log检查SearchAttributebyName函数时,这工作正常。但是当我用trythebot检查SearchAttributebyName函数时,我一直得到null输出。请帮助。

s4chpxco

s4chpxco1#

您需要做一个小的更改,SearchAttributebyName实际上不返回任何内容,因为forEach循环本身没有return语句。
这里有一个可能的方法

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";
}
k10s72fa

k10s72fa2#

Array.forEach()方法接受一个函数,并对数组中的每个元素执行该函数。函数中的return语句只是让.forEach()继续执行下一个元素。返回值不会传递到任何地方。
您可以改用Array.map()来使代码正常工作,如下所示:

function test() {
  console.log(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]);
}

相关问题