【问题标题】:Inner For Loop not executing in App Script内部 For 循环未在 App 脚本中执行
【发布时间】:2021-03-26 02:28:21
【问题描述】:

上下文

在用于 gsheets 的谷歌应用程序脚本中,我正在运行此函数,该函数根据 2 列中的项目名称和 ID 列表在每行单个单元格内搜索逗号分隔列表中的项目名称。

该函数在另一个函数中调用,该函数遍历数据表中的每一行数据。

目标是用逗号分隔列表中的 id 替换名称。

问题

嵌套循环没有运行!当我设置训练输出以测试代码被阻塞的位置时,它位于内部 for 循环中,它在该行中断并且根本不执行。我不知道为什么会这样,因为我看不出我的语法有问题。

请问有什么我可能出错的地方吗?

数据如下所示:


Item Directory Table:

Item ID | Item Name
--------------------
1234    | Item 1
46976   | Item 2
3526    | Item 3
32255   | Item 4
425     | Item 5  


Data table:

Data Name | Items
--------------------
Row 1     | Item 1, Item 2, Item 5
Row 2     | Item 5, Item 2
Row 3     | Item 4
Row 4     | 
Row 5     | Item 1


期望的输出:

Row 1 = [1234, 46976, 425] // updated item 2
Row 2 = [425, 46976]
Row 3 = [32255]
Row 4 = []
Row 5 = [1234]

这是我的功能:

function findItems(x) {
  var items = [];
  var j = 0;
  var i = 0;
  var itemNames = Items.getRange(2 ,11).getValue().split(', ');
  var itemIDs = Items.getRange(3 ,11).getValue().split(', ');
  
  if (data.getRange(x, 6).getValue() != '') {
    items = data.getRange(x, 6).getValue().split(', ');
    for (i = 0; i < items.length; i++) {
      output.getRange(2, 1).setValue(items[i]);
      for (j = 0; j < itemNames.length; j++) {
       if (items[i] === itemNames[j]) {
          items[i] = itemIDs[j];
        }
      }
    }
  }
  return items
}

【问题讨论】:

  • 如果内部循环没有执行,则意味着for循环的条件部分不满足。
  • 我不反对 GAS,但我认为在您的情况下,谷歌公式会更合适,除非您没有其他选择而不是使用 GAS。
  • 使用将项目名称转换为 ID 和单个循环的对象很容易获得所需的输出
  • 如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer

标签: javascript for-loop google-apps-script google-sheets nested-loops


【解决方案1】:

我将在下面提供的是一次性运行所有行。随意修改以获得您的预期行为,您可以添加参数或调用函数作为公式来逐个填充单元格。

function findItems() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  var ids = sheet.getRange('A2:A' + lastRow).getValues().flat();
  var names = sheet.getRange('B2:B' + lastRow).getValues().flat();
  var data = sheet.getRange('C2:C' + lastRow).getValues().flat();
  var items = sheet.getRange('D2:D' + lastRow).getValues();

  items.forEach(function(item, count){
    var elems = item[0].split(",");
    for(var i = 0; i < elems.length; i++){
      for(var j = 0; j < names.length; j++){
        if(elems[i].trim() == names[j].trim()){
          elems[i] = ids[j];
          break;
        }
      }
    }    
    // separated the formatting so you can easily modify here
    // followed the formatting in your post
    var output = data[count] + ' = [' + elems.join(', ') + ']';
    sheet.getRange('E' + (count + 2)).setValue(output);
  });
}

这是此代码的预期输出。

如果你想返回一些东西,你可能需要修改上面的代码,因为这只会将字符串 output 设置为单元格的值。

逻辑非常简单,但如果您有任何澄清/问题,请随时在下方发表评论。

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2022-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多