【问题标题】:Creating One to N rows [duplicate]创建一到N行[重复]
【发布时间】:2022-02-02 16:05:23
【问题描述】:

我正在努力创建一个脚本,该脚本从 col A 中获取每个值并根据 col C 和 D 中的值映射它们。

下图直观说明:

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    试试这个。请注意,我对每列使用一个 while 循环,以防它们的高度不同。如果它们的高度相同,getDataRange() 将返回最后填充的行,所以我需要添加一个空行来停止 while 循环。

    function mapper() {
      try {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sh = ss.getSheetByName("Sheet3");
        // assuming output isn't there yet range=A1:D4
        var data = sh.getDataRange().getValues();
        data.push(["","","",""]); // push an empty row to be safe
        var i = 1;
        var j = 1;
        var k = 1;
        var rows = [];
        while( data[i][0] !== "" ) {
          j = 1;
          while( data[j][2] !== "" ) {
            k = 1;
            while( data[k][3] !== "" ) {
              rows.push([data[i][0],data[j][2],data[k][3]]);
              k++;
            }
            j++;
          }
          i++;
        }
        // put results in F2
        sh.getRange(2,6,rows.length,rows[0].length).setValues(rows);
      }
      catch(err) {
        Logger.log(err);
      }
    }
    

    【讨论】:

      【解决方案2】:

      我相信您要查找的是 A、C 和 D 列的笛卡尔积。

      在这里,我在Cartesian product of multiple arrays in JavaScript 上针对您的问题实施了 rsp 回答。

      试试这个:

      代码:

      function myFunction() {
        var sh = SpreadsheetApp.getActiveSheet();
        var nameRangeLastRow = sh.getRange("A1").getNextDataCell(SpreadsheetApp.Direction.DOWN).getLastRow();
        var nameVal = sh.getRange(2, 1, nameRangeLastRow - 1, 1).getValues().flat();
        var regionRangeLastRow = sh.getRange("C1").getNextDataCell(SpreadsheetApp.Direction.DOWN).getLastRow();
        var regionVal = sh.getRange(2, 3, regionRangeLastRow - 1, 1).getValues().flat();
        var positionRangeLastRow = sh.getRange("D1").getNextDataCell(SpreadsheetApp.Direction.DOWN).getLastRow();
        var positionVal = sh.getRange(2, 4, positionRangeLastRow - 1, 1).getValues().flat();
        const cartesian = (...a) => a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat())));
        var result = cartesian(nameVal, regionVal, positionVal);
        sh.getRange(2, 6, result.length, 3).setValues(result);
      }
      

      输出:

      【讨论】:

        猜你喜欢
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 2015-10-23
        • 2021-01-17
        • 1970-01-01
        相关资源
        最近更新 更多