1

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

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

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

4

3 回答 3

2

我相信你的目标如下。

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

修改点:

  • 在这种情况下,我认为当使用 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.

参考:

于 2021-01-15T13:25:20.343 回答
1

使用范围列表

sheet.getRangeList(range1).setNumberFormat('0.00%');
sheet.getRangeList(range).setValue('% наценки'));
于 2021-01-15T17:51:35.953 回答
1

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

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

代替:

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

和:

range1.reverse().forEach(c => sheet.getRange(c+sheet.getLastRow()).setNumberFormat('0.00%'));
于 2021-01-15T10:02:15.987 回答