Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在谷歌应用程序脚本中获取边框最有效的方法是什么_Performance_Google Apps Script_Border_Google Sheets Api - Fatal编程技术网

Performance 在谷歌应用程序脚本中获取边框最有效的方法是什么

Performance 在谷歌应用程序脚本中获取边框最有效的方法是什么,performance,google-apps-script,border,google-sheets-api,Performance,Google Apps Script,Border,Google Sheets Api,在谷歌应用程序脚本中获取边界详细信息的最佳方法是什么 我在GAS文档中看不到任何带有边框的内容,因此我不得不求助于通过电子表格API获取边框 这是可行的,除了当边界数量变大时,需要很长时间才能返回,或者根本不返回 有更好的方法吗 var fieldsBorders = 'sheets(data(rowData/values/userEnteredFormat/borders))'; var currSsId = SpreadsheetApp.getActiveSpreadsheet().get

在谷歌应用程序脚本中获取边界详细信息的最佳方法是什么

我在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秒。
    • 对于这种情况,您希望进一步降低成本

    • 你的回复评论是
      也许是一张更大的纸,不管怎样,50年代是一个很长的时间来获得边界。其他的加油需要很短的时间才能完成。您能确认这是获取边界的唯一方法吗?
如果我的理解是正确的,那么这个变通方法怎么样?在这个解决方法中,我直接请求Sheets API的端点来检索边界

解决方法: 样本情况 在这个示例脚本中,作为示例情况,我假设默认的工作表有26列x1000行,并且边框设置为所有单元格

示例脚本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: []}]}]});
var sep=500;//按1请求检索行。
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请求=[];
var maxRows=1000;
var行=1;
对于(变量i=0;i
结果: 使用示例脚本2时,获得了以下结果

  • sep
    为500时(在本例中,运行2个API调用),平均处理时间为1.9秒
  • sep
    为200时(在本例中,运行5个API调用),平均处理时间为1.3秒
但是,如果一次运行中的请求数增加,则会发生与配额过多相关的错误。请小心这个

注:
  • 这是一个用于测试上述情况的简单示例。所以我认为上面的脚本不能用于所有情况。如果您使用上述示例脚本,请根据您的情况进行修改。
参考资料:

我认为使用Sheets API检索电子表格中的边框是合适的。因此,我可以问一下当边框数量变大时,返回或根本不返回需要很长时间的情况。
?因此,作为一个示例,我在默认的26 x 1000电子表格中设置了所有单元格,并尝试使用上述调用获取边框,结果显示数据太多,超时。感谢您的回复。在我的环境中,当我为26 x 1000单元格设置边框并运行脚本时,处理时间大约为50秒。那么,您能否提供复制您的情况的详细流程?我想确认一下,并考虑一下你的解决方案或解决办法。也许这是一张更大的表,不管怎样,50年代是一个很长的时间来获得边界。其他的加油需要很短的时间才能完成。你能确认这是获得边界的唯一途径吗?谢谢你的回复。我提出了一个变通办法作为答案。你能确认一下吗?如果我误解了你的问题,而这不是你想要的结果,我道歉。那太好了。非常感谢你的详细回答。不幸的是,我现在正在休下周的年假,所以在我回来之前,我可能无法正确地测试这一点,尽管它看起来确实正是我想要的。如果它能从50秒直接呼叫降到2秒,我会非常激动。我真的希望它也能管理更多的单元格,有时我需要处理500000个单元格的数据,所以即使这需要10秒左右的时间并且没有超时,那也太棒了。@user3284707感谢您的回复。虽然我从未确认过大约500000个电池,但我认为降低成本的方向是相同的。重要的一点是,在测试脚本时,如果一次运行中的请求数增加,则会出现与配额过多相关的错误。请小心这个。