首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在创建时设置工作表的行数和列数?(还有谷歌的“高级参数”)

如何在创建时设置工作表的行数和列数?(还有谷歌的“高级参数”)
EN

Stack Overflow用户
提问于 2015-11-18 17:59:44
回答 4查看 7.6K关注 0票数 7

在重新创建电子表格时,谷歌的SpreadsheetApp允许用户指定所述电子表格的行数和列数:

代码语言:javascript
运行
复制
var spreadsheet = SpreadsheetApp.create(name, rows, columns);

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

我需要做的是复制在现有电子表格中插入新表时的这种行为。显然,没有明确的方法可以做到这一点。

唯一的线索是,创建新工作表的函数

代码语言:javascript
运行
复制
var sheet = spreadsheet.insertSheet(options);

也可以选择使用这个神秘的参数options,除了这里之外,这里从来没有描述过它,其中谷歌声明这个“高级参数”对象可以用来复制模板中的工作表。

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

总括而言,问题如下:

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

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-18 21:25:11

有了你强加的限制(“等等”),就不可能回答你的问题了。这些选项是从一个模板电子表格开始,它包含您想要的所有工作表,克隆电子表格中已经存在的工作表,或者添加新的工作表,然后将它们展开或修剪到您想要的大小。

效用函数

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

代码语言:javascript
运行
复制
/**
 * 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 columns
      newSheet.deleteColumns(columns+1, newSheetColumns-columns);
    }
    else if (columns > newSheetColumns) {
      // add columns
      newSheet.insertColumnsAfter(newSheetColumns,columns-newSheetColumns);
    }
  }
  
  // Return new Sheet object
  return newSheet;
}

实例与性能

您对性能缓慢表示了关注;下面是单个场景的执行记录中的一些观察结果。调整尺寸所需的时间不超过插入默认工作表所需的时间。

插入默认工作表:

代码语言:javascript
运行
复制
insertSheet();

这个脚本不超过200 is (其中大部分都是Spreadsheet.insertSheet()):

代码语言:javascript
运行
复制
[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]

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

代码语言:javascript
运行
复制
insertSheet("New sheet",1, 10, 10);

这大约需要325毫秒:

代码语言:javascript
运行
复制
[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]

最后,在具有2000行和52列的特定索引处插入工作表(两者都是默认值的两倍):

代码语言:javascript
运行
复制
insertSheet("Big Sheet",1, 2000, 52);

这大约需要240毫秒:

代码语言:javascript
运行
复制
[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]
票数 15
EN

Stack Overflow用户

发布于 2015-11-18 21:17:41

需要考虑的一个选项是,按照您的建议,从相反的方向来考虑它:与创建具有x列和y行的工作表不同,创建一个具有默认列/行数的工作表,并使用sheet.deleteColumns(columnPosition, howMany)sheet.deleteRows(rowPosition, howMany)方法定义工作表大小。

您的代码应该是这样的:

代码语言:javascript
运行
复制
var ss = SpreadsheetApp.create(name, rows, columns);
var myNumColumns = ____; //or defined in the function call
var newSheet = ss.insertSheet(sheetName, sheetIndex, options);
var columnsToDelete = newSheet.getLastColumn() - myNumColumns;
newSheet.deleteColumns((myNumColumns-1), columnsToDelete);

如果您希望最终用户为自己创建菜单,那么您可能需要创建自定义菜单函数或添加界面来实现这一点,因为您不能真正创建添加新工作表的触发器。

票数 2
EN

Stack Overflow用户

发布于 2016-12-05 17:34:17

不幸的是,getLastColumn将无法工作,因为这将得到包含内容的最后一列。你想要的是getMaxColumns。您可以按照链接获得更详细的差异信息。

类似于:

代码语言:javascript
运行
复制
var doc = SpreadsheetApp.openByID(FILEID_HERE);
var sheet = doc.getSheetByName(SHEETNAMEHERE);
var deleteColumns = sheet.getMaxColumns - sheet.getLastColumn; 

sheet.deleteColumns((sheet.getLastColumn() +1),deleteColumns); 

在此示例中,deleteColumns将等于列总数减去其中包含内容的列数。然后,在下一行中,设置sheet.deleteColumns(start column, how many columns)

看起来这可能很快就要日落了,在这种情况下,您可以使用.deleteColumn(columnPosition)命令和一个循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33787057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档