Google 表格:需要粘贴格式

问题描述 投票:0回答:1

我有一个 Google 表格,其中包含第一个主表格上的所有数据。我对脚本了解不多,这就是为什么我将所有脚本分开。

脚本 1。我运行一个脚本,用于创建以 A 列中的信息命名的新选项卡。 脚本 2。我运行另一个脚本来冻结上面脚本 1 制作的每张纸的第一行

脚本 3。我运行第三个脚本来调整所有行的大小。

我想知道如何:

4.将格式从第一个主工作表复制到使用脚本 (1) 自动创建的工作表。需要明确的是,我没有粘贴任何值 - 只是格式。

5.删除所有多余的列并删除除 3 个额外行之外的所有内容

6.有没有办法让它按字母顺序排列脚本 1 中创建的选项卡?现在,我必须按 A 列数据对主工作表进行排序,运行脚本 1,然后按姓氏(D 列)重新排序。我不想重复求助,但这对我的成功并不重要。

我并不反对所有脚本同时运行,而不是分开运行,我只是不知道如何将它们全部混合在一起。

我的谷歌表格是:https://docs.google.com/spreadsheets/d/1ME26lkh6F552uRQ3vl9Fv-BPIc2bpM_GlYxWCVoPkVA/edit?usp=sharing 脚本 1 已在此工作表上运行(新选项卡已创建)

脚本 1(新选项卡):

function makeTabs2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("All");
  var last = sheet.getLastRow();//identifies the last active row on the sheet
 
  for (var i = 1; i < last; i++) {
 
    var tabName = sheet.getRange(i + 1, 1).getValue();//get the range in column A and get the value. 
    try {
      if (ss.getSheetByName(tabName) == null) {
        var create = ss.insertSheet(tabName);//create a new sheet with the value
        // this is the addition to add the formula to the new tab   
    ss.getSheetByName(tabName).getRange("A1").setFormula('QUERY(All!A1:R,"select * where upper(A) = \'' + tabName.toUpperCase() + '\'",1)');
 
      }
    }
    catch (err) {
      Logger.log(err);
 
    }
  }
}

脚本 2(冻结顶行):

function freezeRowsAndColumns() {
  var activeSheet = SpreadsheetApp.getActiveSheet();
  activeSheet.setFrozenRows(1);
}

脚本 3(调整所有行的大小):

 function resizeAllrows() {
    var ss = SpreadsheetApp.getActive();
    var requests = ss.getSheets().map(sheet => {
      return {
        updateDimensionProperties: {
          properties: { pixelSize: 50 },
          range: { sheetId: sheet.getSheetId(), dimension: "ROWS" },
          fields: "pixelSize"
        }
      }
    });
    Sheets.Spreadsheets.batchUpdate({ requests: requests }, ss.getId());
  }

任何/所有帮助将不胜感激。

我测试了在这里找到的代码的几种变体,但没有成功。

google-sheets google-apps-script gsheets
1个回答
0
投票

我相信您的目标如下。

  • 您想要将单元格格式(包括行高和列宽)复制到新工作表。
  • 您想将“A”列保留到“R”列。并且,您想删除“S”列之后的其他列。
  • 您想要按字母顺序对新工作表进行排序。

修改要点:

  • 在您的脚本中,
    getValue()
    在循环中使用。在这种情况下,我认为首先,从循环外部的“A”列检索所有值。这可用于按字母顺序对新工作表进行排序。
  • 为了复制包括行高和列宽的单元格格式,我认为可以使用Class SheetcopyTo(spreadsheet)和Class SheetclearContents()的组合。
  • 为了删除“S”列之后的内容,在复制工作表后,可以运行此操作。

当这些点都体现在你的脚本中时,下面的修改如何?

修改后的脚本1:

在此修改中,您的脚本已被修改。

function makeTabs2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("All");

  // --- I modified the below script.
  var sheets = ss.getSheets().map(s => s.getSheetName());
  var values = [...new Set(sheet.getRange("A2:A" + sheet.getLastRow()).getValues().map(([a]) => a))].sort((a, b) => a > b ? 1 : -1);
  values.forEach(tabName => {
    try {
      if (!sheets.includes(tabName)) {
        var create = sheet.copyTo(ss).setName(tabName).clearContents();
        create.deleteColumns(19, create.getMaxColumns() - 18);
        create.getRange("A1").setFormula('QUERY(All!A1:R,"select * where upper(A) = \'' + tabName.toUpperCase() + '\'",1)');
      }
    } catch (err) {
      Logger.log(err.stack);
    }
  });
}

修改后的脚本2:

当我看到您提供的电子表格时,似乎要复制的页数是94。在这种情况下,我担心电子表格服务(SpreadsheetApp)可能会因为最长执行时间而无法使用。因此,作为另一项修改,我建议使用 Sheets API。

使用此脚本时,请在高级 Google 服务中启用 Sheets API

function makeTabs3() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("All");
  var sheetId = sheet.getSheetId();
  var sheets = ss.getSheets().map(s => s.getSheetName());
  var values = [...new Set(sheet.getRange("A2:A" + sheet.getLastRow()).getValues().map(([a]) => a))].sort((a, b) => a > b ? 1 : -1);
  var requests = values
    .filter(s => !sheets.includes(s))
    .flatMap((tabName, i) => {
      const newSheetId = `12345${i + 1}`;
      return [
        { duplicateSheet: { sourceSheetId: sheetId, insertSheetIndex: i + 1, newSheetName: tabName, newSheetId } },
        { deleteDimension: { range: { sheetId: newSheetId, dimension: "COLUMNS", startIndex: 18 } } },
        { repeatCell: { fields: "userEnteredValue", range: { sheetId: newSheetId } } },
        { updateCells: { range: { sheetId: newSheetId, startRowIndex: 0, endRowIndex: 1, startColumnIndex: 0, endColumnIndex: 1 }, rows: [{ values: [{ userEnteredValue: { formulaValue: `=QUERY(All!A1:R,"select * where upper(A) = '${tabName.toUpperCase()}'",1)` } }] }], fields: "userEnteredValue" } }
      ]
    });
  if (requests.length == 0) return;
  Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
  • 当我使用您提供的电子表格测试此脚本时,我确认处理时间约为 90 秒。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.