setValue 和 setNumberFormat 中的 Google sheets api v4 是否可以进一步降低请求的成本?

Is it possible to further reduce the cost of the request with Google sheets api v4 in setValue and setNumberFormat?

现在我使用下面的代码来格式化和插入值。

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('% наценки'));
 }

是否可以进一步降低请求成本并加快脚本速度? 当格式化很多文件时,它会节省我很多时间

如果选择的列没有特定的模式。例如,每 2 列更改格式或类似的格式,那么我认为您唯一的选择是硬拷贝它们。

  • 由于您正在寻找性能,请考虑对 range1 进行操作,而不是对整列进行操作,而是仅对包含内容的最后一行进行操作。如果 sheet.
  • 中有很多行,这将降低脚本的成本

替换:

range1.reverse().forEach(c => sheet.getRange(c).setNumberFormat('0.00%'));

与:

range1.reverse().forEach(c => sheet.getRange(c+sheet.getLastRow()).setNumberFormat('0.00%'));

我相信你的目标如下。

  • 您想减少脚本的处理成本。

修改点:

  • 在这种情况下,我认为当使用SheetsAPI中的batchUpdate的RepeatCellRequest和UpdateCellsRequest时,处理成本可能会降低一些。

修改后的脚本:

在您使用此脚本之前,please enable Sheets API at Advanced Google services。并且,请设置spreadsheetIdsheetNameranges的变量。 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);
}

注:

  • 在这个修改后的脚本中,当Spreadsheet有“A”到“Z”列时,当使用“AA”列时,会出现类似exceeds grid limits. Max rows: 1000, max columns: 26的错误。所以请注意这一点。在您使用此脚本之前,请为您的 ranges.
  • 添加列到 sheet

参考文献:

使用RangeList:

sheet.getRangeList(range1).setNumberFormat('0.00%');
sheet.getRangeList(range).setValue('% наценки'));