代码之家  ›  专栏  ›  技术社区  ›  Rianti

如何使用应用程序脚本将多行文本拆分为行?

  •  0
  • Rianti  · 技术社区  · 2 年前

    我使用第三个应用程序,将电子表格作为数据库。每次执行应用程序时,它都会以多行文本的形式返回数据,如下所示: |代码|名称|日期|任务|单位|进度| | -------- | -------- | -------- | -------- | -------- | -------- | |代码1
    代码2
    代码3|user1
    user2
    user3|date1
    日期2
    日期3|task1
    任务2
    任务3 |第一单元
    第二单元
    第三单元|已完成
    不间断的
    需要修订| (附言:我发布后看到我的第一列很乱,所以我给出了从应用程序返回的数据的图片,以防表加载不正确) multiline text table

    我需要使用应用程序脚本将多行数据拆分成行,所以它应该是这样的,

    密码 名称 日期 任务 单元 进步
    代码1 user1 日期1 任务1 第一单元 完成
    代码2 user2 日期2 任务2 第二单元 不间断的
    代码3 user3 日期3 任务3 第三单元 需要修订

    我知道一些简单的脚本,比如如何使用分隔符将文本拆分为列,例如:

    function myFunction() {
      
      var ss= SpreadsheetApp.getActiveSpreadsheet();
      var sh= ss.getSheetByName('Sheet1');
      var lr= sh.getLastRow();
      var range1= sh.getRange('A2:A' + lr);
      range1.splitTextToColumns('\n');
    
    }
    

    但它只是将文本拆分为列,而不是下面的行,显然它不适用于数据数组。如何使用应用程序脚本将多行文本拆分为行?

    提前谢谢。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Tanaike    2 年前

    在您的情况下,下面的示例脚本如何?

    示例脚本:

    function myFunction() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sh = ss.getSheetByName('Sheet1');
    
      // --- I modified the below script.
      var values = sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getValues();
      var newValues = values.flatMap(r => {
        var temp = r.map(c => c.split("\n").map(d => d.trim()));
        var maxLen = Math.max(...temp.map(e => e.length));
        temp = temp.map(e => e.length < maxLen ? [...e, Array(maxLen - e.length).fill(null)] : e);
        return temp[0].map((_, col) => temp.map((row) => row[col] || null));
      });
      sh.getRange(2, 1, newValues.length, newValues[0].length).clearContent().setValues(newValues);
    }
    

    测试:

    当使用提供的示例表运行此脚本时,将获得以下结果。

    enter image description here

    参考文献: