首页 > 解决方案 > 是否可以使用 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('% наценки'));
 }

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

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-apibatch-request

解决方案


我相信你的目标如下。

  • 您想降低脚本的处理成本。

修改点:

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

修改后的脚本:

在使用此脚本之前,请在 Advanced Google services 中启用 Sheets API。并且,请设置spreadsheetId,sheetName和的变量rangesranges来自您的脚本。当您想要更多范围时,请将它们添加到数组中。

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.

参考:


推荐阅读