google-apps-script - 是否可以使用 setValue 和 setNumberFormat 中的 Google sheet api v4 进一步降低请求的成本?
问题描述
现在我使用下面的代码来格式化和插入值。
function AddName () {
const range1 = ['Q4:Q','S4:S','U4:U','W4:W','Y4:Y','AA4:AA','AC4:AC','AE4:AE',
'AG4:AG','AI4:AI','AK4:AK','AM4:AM','AO4:AO','AQ4:AQ','AS4:AS','AU4:AU','AW4:AW','AY4:AY','BA4:BA',
'BC4:BC','BE4:BE','BG4:BG','BI4:BI','BK4:BK','BM4:BM','BO4:BO','BQ4:BQ','BS4:BS','BU4:BU','BW4:BW',
'BY4:BY','CA4:CA','CC4:CC','CE4:CE','CG4:CG','CI4:CI','CK4:CK','CM4:CM','CO4:CO','CQ4:CQ','CS4:CS',
'CU4:CU','CW4:CW','CY4:CY','DA4:DA','DC4:DC','DE4:DE','DG4:DG','DI4:DI','DK4:DK','DM4:DM','DO4:DO',
'DQ4:DQ','DS4:DS','DU4:DU','DW4:DW','DY4:DY','EA4:EA','EC4:EC','EE4:EE','EG4:EG','EI4:EI','EK4:EK',
'EM4:EM','EO4:EO'];
range1.reverse().forEach(c => sheet.getRange(c).setNumberFormat('0.00%'));
const range = ['Q1','S1','U1','W1','Y1','AA1','AC1','AE1','AG1','AI1','AK1',
'AM1','AO1','AQ1','AS1','AU1','AW1','AY1','BA1','BC1','BE1','BG1','BI1','BK1','BM1','BO1','BQ1',
'BS1','BU1','BW1','BY1','CA1','CC1','CE1','CG1','CI1','CK1','CM1','CO1','CQ1','CS1','CU1','CW1',
'CY1','DA1','DC1','DE1','DG1','DI1','DK1','DM1','DO1','DQ1','DS1','DU1','DW1','DY1','EA1','EC1',
'EE1','EG1','EI1','EK1','EM1','EO1'];
range.reverse().forEach(c => sheet.getRange(c).setValue('% наценки'));
}
是否可以进一步降低请求成本并加快脚本速度?格式化很多文件时,它会为我节省很多时间
解决方案
我相信你的目标如下。
- 您想降低脚本的处理成本。
修改点:
- 在这种情况下,我认为当使用 Sheets API 中的 batchUpdate 的 RepeatCellRequest 和 UpdateCellsRequest 时,处理成本可能会降低一点。
修改后的脚本:
在使用此脚本之前,请在 Advanced Google services 中启用 Sheets API。并且,请设置spreadsheetId
,sheetName
和的变量ranges
。ranges
来自您的脚本。当您想要更多范围时,请将它们添加到数组中。
function myFunction() {
const spreadsheetId = "###"; // Please set the Spreadsheet ID.
const sheetName = "Sheet1"; // Please set the sheet name.
// Please set the ranges. In this sample, a part of your ranges is used. So please modify this for your actual situation.
const ranges = ['Q4:Q','S4:S','U4:U',,,];
const sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
const sheetId = sheet.getSheetId();
const rangeList = sheet.getRangeList(ranges).getRanges();
const requests = rangeList.flatMap(r => [
{repeatCell:{cell:{userEnteredFormat:{numberFormat:{type:"PERCENT",pattern:"0.00%"}}},range:{sheetId:sheetId,startRowIndex:r.getRow() - 1,startColumnIndex:r.getColumn() - 1,endColumnIndex:r.getColumn() + r.getNumColumns() - 1},fields:"userEnteredFormat"}},
{updateCells:{rows:[{values:[{userEnteredValue:{stringValue:"%наценки"}}]}],range:{sheetId:sheetId,startRowIndex:0,endRowIndex:1,startColumnIndex:r.getColumn() - 1,endColumnIndex:r.getColumn() + r.getNumColumns() - 1},fields:"userEnteredValue"}}
]);
Sheets.Spreadsheets.batchUpdate({requests: requests}, spreadsheetId);
}
笔记:
- 在此修改后的脚本中,当电子表格具有“A”到“Z”列时,当使用“AA”列时,
exceeds grid limits. Max rows: 1000, max columns: 26
会发生类似错误。所以请注意这一点。在使用此脚本之前,请在工作表中为您的ranges
.
参考:
推荐阅读
- javascript - 从用户定义的打字稿路径导出枚举导致找不到模块
- excel - 查找匹配 VBA 的行号
- javascript - 如何访问未知父级的上下文
- json - Drupal syslog 与 json 的奇怪行为
- javascript - 节点 postgres“未定义客户端”& 无法读取未定义错误的属性“查询”
- c - C函数初始化和显示单链表给出分段错误
- c - 尝试从字符串中删除后缀但没有成功
- docker - 服务无法与k8s集群中的rabbitmq通信
- r - 在 windows 上安装 rcplex
- java - 无法从 HTML Dom 获取值/文本。我使用了 Selenium WebDriver 的 getAttribute() 和 getText()