首页 > 解决方案 > 有没有更快的方法来使用 Google Appscript 显示/隐藏多列?

问题描述

我目前有下面的脚本,我已将每个脚本分配给我的电子表格上的一个按钮,以便用户可以显示或隐藏下面所述的列。我的问题是 - 有没有更快的方法来达到同样的结果?该脚本需要几秒钟,因此可以加快速度。


function showColumns() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('National FY21 - 23');
  sheet.showColumns(4,6);   
  sheet.showColumns(12,6);
  sheet.showColumns(20,6);
  sheet.showColumns(28,6);
  sheet.showColumns(36,6);
  sheet.showColumns(44,6);
  sheet.showColumns(52,6);
  sheet.showColumns(60,6); 
  sheet.getRange('B3').setValue('Y');
}

function hideColumns() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName('National FY21 - 23');
  sheet.hideColumns(4,6);   
  sheet.hideColumns(12,6);
  sheet.hideColumns(20,6);
  sheet.hideColumns(28,6);
  sheet.hideColumns(36,6);
  sheet.hideColumns(44,6);
  sheet.hideColumns(52,6);
  sheet.hideColumns(60,6); 

}

标签: google-apps-scriptgoogle-sheets

解决方案


有没有更快的方法来使用 Google Appscript 显示/隐藏多列?

回答:

有点儿; 您可以在一次调用中显示所有列,但如果使用内置的SpreadsheetAppApps 脚本服务,则必须以这种方式隐藏。

更多信息:

由于您希望隐藏的列由您不想隐藏的列分隔,因此除了单独调用每组列之外,没有其他方法可以隐藏它们。

但是,您可以调用sheet.showColumns(4, 62)以在一次调用中显示范围内的所有列,而不是单独调用每个列子集。

但是,这仅适用于中间没有隐藏的列但您不想显示的情况。如果是这种情况,那么不幸的是,像你一样明确地单独调用它们是唯一的方法。

编辑:正如Tanaike在对此答案的评论中提到的,您也可以在一个请求中进行隐藏调用,但要执行此操作,您需要通过Resources > Advanced Google services...菜单项激活电子表格 API 高级 Google 服务。然后,这将利用一个batchUpdate请求,该请求包含一个 API 调用中的所有请求。这有点复杂,但肯定是可行的。

代码:

正如我之前提到的,您可以修改您的showColumns()函数以仅在一次调用中显示所有列:

function showColumns() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('National FY21 - 23');
  sheet.showColumns(4, 62);
  sheet.getRange('B3').setValue('Y');
}

按照此答案的“更多信息”部分中的说明启用电子表格 API 高级 Google 服务后,您可以构建批处理请求并将其发送到 API,并对hideColumns()函数进行以下修改:

function hideColumns() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();  
  var sheet = ss.getSheetByName('National FY21 - 23')
  var sheetId = sheet.getSheetId();
  
  var startColumns = [4, 12, 20, 28, 36, 44, 52, 60];
  var requests = []
  
  startColumns.forEach(function(x) {
    requests.push({
      'updateDimensionProperties': {
        "range": {
          "sheetId": sheetId,
          "dimension": 'COLUMNS',
          "startIndex": x - 1,
          "endIndex": x + 5,
        },
        "properties": {
          "hiddenByUser": true,
        },
        "fields": 'hiddenByUser',
      }
    })
  });
  
  Sheets.Spreadsheets.batchUpdate({"requests": requests }, ssId)  
}

参考:


推荐阅读