performance - 在 Google Apps Script 中获取边框的最有效方法是什么

标签 performance google-apps-script border google-sheets-api

在 Google Apps Script 中获取边框详细信息的最佳方法是什么?

我在 GAS 的文档中看不到任何带边框的东西,所以我不得不求助于通过电子表格 API 获取边框。

这可以正常工作,除了当边界数量变大时需要很长时间才能返回或根本不返回。

有一个更好的方法吗?

var fieldsBorders = 'sheets(data(rowData/values/userEnteredFormat/borders))';

var currSsId = SpreadsheetApp.getActiveSpreadsheet().getId();
var activeSheet = SpreadsheetApp.getActiveSheet();
var name = activeSheet.getName();

var data = Sheets.Spreadsheets.get(currSsId, {
    ranges: name,
    fields: fieldsBorders
});

最佳答案

  • 您希望降低从电子表格中的工作表检索边框的过程成本。
  • 当我为 26 x 1000 单元格设置边框并运行您的脚本时,我的环境中的处理时间约为 50 秒。
  • 对于这种情况,您更希望降低成本。
  • 您的回复评论是 perhaps it was a bigger sheet it was on, either way 50s is a long time to get the borders. The other calls to GAS take a very small amount of time to complete. Can you confirm this is the only way to get borders?

  • 如果我的理解是正确的,这个解决方法如何?在此解决方法中,我直接请求 Sheets API 的端点以检索边框。

    解决方法:

    示例情况

    在此示例脚本中,作为示例情况,我假设默认工作表具有 26 列 x 1000 行,并且边框设置为所有单元格。

    示例脚本 1:

    在此示例脚本中,边框由一个 API 调用检索。
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var fileId = ss.getId();
    var sheetName = ss.getActiveSheet().getName();
    var token = ScriptApp.getOAuthToken();
    var fields = "sheets/data/rowData/values/userEnteredFormat/borders";
    var params = {
        method: "get",
        headers: {Authorization: "Bearer " +  token},
        muteHttpExceptions: true,
    };
    var range = sheetName + "!A1:Z1000";
    var url = "https://sheets.googleapis.com/v4/spreadsheets/" + fileId + "?ranges=" + encodeURIComponent(range) + "&fields=" + encodeURIComponent(fields); 
    var res = UrlFetchApp.fetch(url, params);
    var result = JSON.parse(res.getContentText());
    

    结果:
  • 使用示例脚本 1 时,平均处理时间为 2.2 秒。
  • 虽然我不太清楚Advanced Google Service的Sheets API的内部流程,但是发现直接向端点请求时,可以降低流程成本。

  • 示例脚本 2:

    在此示例脚本中,边框是通过多个 API 调用使用异步过程检索的。
    var sep = 500; // Rows retrieving by 1 request.
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var fileId = ss.getId();
    var sheetName = ss.getActiveSheet().getName();
    var token = ScriptApp.getOAuthToken();
    var fields = "sheets/data/rowData/values/userEnteredFormat/borders";
    var requests = [];
    var maxRows = 1000;
    var row = 1;
    for (var i = 0; i < maxRows / sep; i++) {
      var range = sheetName + "!A" + row + ":Z" + (row + sep - 1);
      requests.push({
        method: "get",
        url: "https://sheets.googleapis.com/v4/spreadsheets/" + fileId + "?ranges=" + encodeURIComponent(range) + "&fields=" + encodeURIComponent(fields),
        headers: {Authorization: "Bearer " +  token},
      });
      row += sep;
    }
    var response = UrlFetchApp.fetchAll(requests);
    var result = response.reduce(function(ar, e) {
      var obj = JSON.parse(e.getContentText());
      Array.prototype.push.apply(ar.sheets[0].data[0].rowData, obj.sheets[0].data[0].rowData);
      return ar;
    }, {sheets: [{data: [{rowData: []}]}]});
    

    结果:

    当使用示例脚本 2 时,获得了以下结果。
  • sep是 500(在这种情况下,运行了 2 个 API 调用。),平均处理时间为 1.9 秒。
  • sep为 200(在本例中,运行了 5 个 API 调用。),平均处理时间为 1.3 秒。

  • 但是如果一次运行中的请求数增加,则会出现与配额超额相关的错误。请注意这一点。

    笔记:
  • 这是用于测试上述情况的简单示例。所以我认为上面的脚本不能用于所有情况。如果您使用上述示例脚本,请根据您的情况修改它。

  • 引用:
  • fetchAll(requests)
  • Benchmark: fetchAll method in UrlFetch service for Google Apps Script
  • 关于performance - 在 Google Apps Script 中获取边框的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56055708/

    相关文章:

    google-apps-script - 如何通过api基于插入行触发Google Apps脚本功能

    jquery - 如何确定 Google 表格窗口大小

    ios - iOS Cordova 应用程序上的键盘响应缓慢

    performance - Julia 什么是评估数学树的最快方法

    javascript - 返回多个值并访问它们?

    css - 如何在元素周围制作均匀的边框?

    html - 我的按钮周围有一个边框,当我点击屏幕上的某个地方时它会消失

    android - 不同颜色的 TextView Border Top

    performance - 拆箱函数

    performance - 使用 perf 监控每个 CPU 的内存访问