在 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
});
最佳答案
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());
结果:
示例脚本 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 秒。 但是如果一次运行中的请求数增加,则会出现与配额超额相关的错误。请注意这一点。
笔记:
引用:
关于performance - 在 Google Apps Script 中获取边框的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56055708/