【问题标题】:Have only the rows containing the value in Column B copied into the new sheet仅将包含 B 列中值的行复制到新工作表中
【发布时间】:2021-08-05 14:51:34
【问题描述】:

我正在尝试使用 Google 表格完成 2 件事。我有一个包含数据的主表,我想:

  1. 使用基于 B 列中单元格值的名称创建新工作表(已完成)
  2. 将包含 B 中这些值的行复制到该新工作表中

第 1 部分适用于此脚本:

    function onOpen() {
    var menu = [{
            name : "Add",
            functionName : "newSheet"
        }
    ];
    SpreadsheetApp.getActiveSpreadsheet().addMenu("Sheet", menu);
}

function newSheet() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var templateSheet = ss.getActiveSheet();
    var sheet1 = ss.getSheetByName("Sheet1")
        var getNames = sheet1.getRange("B2:B").getValues().filter(String).toString().split(",");

    for (var i = 0; i < getNames.length; i++) {
        var copy = ss.getSheetByName(getNames[i]);
        if (copy) {
            Logger.log("Sheet already exists");
        } else {
            templateSheet.copyTo(ss).setName(getNames[i]);
            ss.setActiveSheet(ss.getSheetByName(getNames[i]));
            ss.moveActiveSheet(ss.getNumSheets());
        }
    }
}

问题是当创建新工作表时,它会复制主工作表的内容。我只想将包含 B 列中的值的行复制到新工作表中。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您可以使用Class SpreadsheetinsertSheet 方法之一,而不是使用copyTo,然后将B 列中具有所需值的行复制到新工作表中。

    复制行的具体代码取决于真正需要复制的内容(值、显示值、公式、单元格格式、富文本单元格内容格式、注释、数据验证、条件格式)

    假设您只对传递值感兴趣,您可以在 getNames for 循环中使用类似以下内容:

    var data = sheet1.getDataRange().getValues().filter(row => row[1] === getNames[i])
    var newSheet = ss.insertSheet(getNames[i]);
    if( data.length > 0 ) newSheet.getRange(1,1,data.length,data[0].length).setValues(data);
    

    相关

    【讨论】:

    • 我需要复制的是包含纯数据、没有公式或任何特殊内容的整行。
    • @Goldorak 请编辑问题以澄清这一点。
    • 天哪,它成功了,非常感谢一百万!
    【解决方案2】:

    您只需再添加一个函数即可从任何工作表中删除多余的行。像这样的:

    function main() {
      var sheet = SpreadsheetApp.getActiveSheet()
      remove_rows("aaa", sheet); // remove all rows, that contain 'aaa' in first column
    }
    
    function remove_rows(value, sheet) {
      var data = sheet.getDataRange().getValues();
      var new_data = data.filter(x => x[0].indexOf(value)>=0)
      sheet.getDataRange().clearContent();
      sheet.getRange(1,1,new_data.length,new_data[0].length).setValues(new_data);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多