如何在创建时设置工作表的行数和列数?(关于谷歌"高级参数"的说法)

Unr*_*gle 6 google-sheets google-apps-script

从头创建电子表格时,Google的SpreadsheetApp允许用户指定所述电子表格的行数和列数:

var spreadsheet = SpreadsheetApp.create(name, rows, columns);
Run Code Online (Sandbox Code Playgroud)

这仅适用于新创建的电子表格中的第一张工作表.

我需要做的是在现有电子表格中插入新工作表时复制此行为.显然没有明确的方法来做到这一点.

唯一的线索是,创建新工作表的功能

var sheet = spreadsheet.insertSheet(options);
Run Code Online (Sandbox Code Playgroud)

可选择采用这个神秘的参数,options除了这里以外没有描述过任何地方,谷歌声称这个"高级参数"对象可用于从模板复制工作表.

在其他地方似乎没有关于此对象的文档.这些高级参数仅用于创建工作表.

总结一下,问题是:

  1. 如何设置在现有电子表格内部以编程方式创建的新工作表的数和数,而无需创建和克隆其他电子表格或使用模板,等等.
  2. 那些先进的参数究竟是什么?我真的很想阅读有关这些的任何文档:如果它们存在,它们甚至可能对某些东西有用!(或至少可用......)

Mog*_*dad 12

由于你施加的限制("等等"),你无法回答你的问题.选项是从包含所需的所有工作表的模板电子表格开始,克隆已存在于电子表格中的现有工作表,或添加新工作表,然后将其展开或修剪为所需大小.

实用功能

假设可以使用最后一个选项,这里是一个实用程序函数,可以处理插入新工作表的各种方法.

/**
 * Wrapper for Spreadsheet.insertSheet() method to support customization.
 * All parameters are optional & positional.
 *
 * @param {String}  sheetName     Name of new sheet (defaults to "Sheet #")
 * @param {Number}  sheetIndex    Position for new sheet (default 0 means "end")
 * @param {Number}  rows          Vertical dimension of new sheet (default 0 means "system default", 1000)
 * @param {Number}  columns       Horizontal dimension of new sheet (default 0 means "system default", 26)
 * @param {String}  template      Name of existing sheet to copy (default "" means none)
 *
 * @returns {Sheet}               Sheet object for chaining.
 */
function insertSheet( sheetName, sheetIndex, rows, columns, template ) {

  // Check parameters, set defaults
  var ss = SpreadsheetApp.getActive();
  var numSheets = ss.getSheets().length;
  sheetIndex = sheetIndex || (numSheets + 1);
  sheetName = sheetName || "Sheet " + sheetIndex;
  var options = template ? { 'template' : ss.getSheetByName(template) } : {};

  // Will throw an exception if sheetName already exists
  var newSheet = ss.insertSheet(sheetName, sheetIndex, options);

  if (rows !== 0) {
    // Adjust dimension: rows
    var newSheetRows = newSheet.getMaxRows();

    if (rows < newSheetRows) {
      // trim rows
      newSheet.deleteRows(rows+1, newSheetRows-rows);
    }
    else if (rows > newSheetRows) {
      // add rows
      newSheet.insertRowsAfter(newSheetRows, rows-newSheetRows);
    }
  }

  if (columns !== 0) {
    // Adjust dimension: columns
    var newSheetColumns = newSheet.getMaxColumns();

    if (columns < newSheetColumns) {
      // trim rows
      newSheet.deleteColumns(rows+1, newSheetColumns-columns);
    }
    else if (columns > newSheetColumns) {
      // add rows
      newSheet.insertColumnsAfter(newSheetColumns,columns-newSheetColumns);
    }
  }

  // Return new Sheet object
  return newSheet;
}
Run Code Online (Sandbox Code Playgroud)

示例和表现

你对性能缓慢表示担忧; 以下是单个场景的执行记录中的一些观察结果.调整尺寸所需的时间并不比插入默认工作表的时间长得多.

插入默认工作表:

insertSheet();
Run Code Online (Sandbox Code Playgroud)

这个脚本不超过200毫秒(大部分只是Spreadsheet.insertSheet()):

[15-11-18 15:56:25:365 EST] Starting execution
[15-11-18 15:56:25:369 EST] SpreadsheetApp.getActive() [0 seconds]
[15-11-18 15:56:25:390 EST] Spreadsheet.getSheets() [0.02 seconds]
[15-11-18 15:56:25:544 EST] Spreadsheet.insertSheet([Sheet 2, 2, {}]) [0.153 seconds]
[15-11-18 15:56:25:565 EST] Sheet.getMaxRows() [0.02 seconds]
[15-11-18 15:56:25:565 EST] Sheet.getMaxColumns() [0 seconds]
[15-11-18 15:56:25:597 EST] Execution succeeded [0.196 seconds total runtime]
Run Code Online (Sandbox Code Playgroud)

在具有10行和10列(小于默认值)的特定索引处插入工作表:

insertSheet("New sheet",1, 10, 10);
Run Code Online (Sandbox Code Playgroud)

这需要大约325ms:

[15-11-18 15:59:54:476 EST] Starting execution
[15-11-18 15:59:54:481 EST] SpreadsheetApp.getActive() [0 seconds]
[15-11-18 15:59:54:520 EST] Spreadsheet.getSheets() [0.038 seconds]
[15-11-18 15:59:54:595 EST] Spreadsheet.insertSheet([New sheet, 1, {}]) [0.075 seconds]
[15-11-18 15:59:54:629 EST] Sheet.getMaxRows() [0.033 seconds]
[15-11-18 15:59:54:699 EST] Sheet.deleteRows([11, 990]) [0.069 seconds]
[15-11-18 15:59:54:746 EST] Sheet.getMaxColumns() [0.046 seconds]
[15-11-18 15:59:54:809 EST] Sheet.deleteColumns([11, 16]) [0.062 seconds]
[15-11-18 15:59:54:810 EST] Execution succeeded [0.329 seconds total runtime]
Run Code Online (Sandbox Code Playgroud)

最后,在特定索引处插入一个包含2000行和52列(两次都是默认值)的工作表:

insertSheet("Big Sheet",1, 2000, 52);
Run Code Online (Sandbox Code Playgroud)

大概需要240ms:

[15-11-18 16:09:36:393 EST] Starting execution
[15-11-18 16:09:36:398 EST] SpreadsheetApp.getActive() [0 seconds]
[15-11-18 16:09:36:419 EST] Spreadsheet.getSheets() [0.02 seconds]
[15-11-18 16:09:36:491 EST] Spreadsheet.insertSheet([Big Sheet, 1, {}]) [0.071 seconds]
[15-11-18 16:09:36:518 EST] Sheet.getMaxRows() [0.027 seconds]
[15-11-18 16:09:36:563 EST] Sheet.insertRowsAfter([1000, 1000]) [0.044 seconds]
[15-11-18 16:09:36:585 EST] Sheet.getMaxColumns() [0.021 seconds]
[15-11-18 16:09:36:645 EST] Sheet.insertColumnsAfter([26, 26]) [0.059 seconds]
[15-11-18 16:09:36:646 EST] Execution succeeded [0.247 seconds total runtime]
Run Code Online (Sandbox Code Playgroud)