我的脚本有范围问题

时间:2019-08-16 17:12:35

标签: google-apps-script google-sheets

我想创建一个按钮,将给定数量的单元格从一张纸移动到另一张纸。起始范围单元格始终相同(A9),并且总共有8列。最后一行将取决于用户完成的行数。如何在范围代码中指示这种行为?

我认为这需要在range字段中进行说明,但无法获得我所需要的。

function finishReport() {
 var ss = SpreadsheetApp.getActiveSpreadsheet()
  sheet = ss.getActiveSheet(),
  sheetName = sheet.getName(),
  data = sheet.getDataRange().getValues();

 if (sheetName == "Main") {
  var range = sheet.getActiveRange(),
  startRow = range.getRowIndex(),
  numRows = range.getNumRows(),
  numCols = range.getNumColumns()
 if (numCols == 8 {
  if (data.length > 1) {
   var values = range.getValues(),
    nextSheet = ss.getSheetByName("History record")
    lastRow = nextSheet.getLastRow();
   nextSheet.getRange(lastRow+1,1,numRows,8).setValues(values);
   sheet.deleteRows(startRow,numRows);
   } 
  } 
 } 
}

我希望用户在标签Main中输入的所有行都移到标签History record中。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

查询

  • 您要复制一个从单元格sudo /usr/bin/python -m easy_install pip sudo /usr/bin/python -m pip install boto 开始并延伸8列直到最后一行包含内容的范围

问题

  • 您使用的getActiveRange()仅返回选定的(=突出显示的)范围-如果工作表中未突出显示任何范围,则仅活动单元格将作为范围返回。

解决方案

  • 通过使用
  • 检索包含行和列的最后一个内容来手动选择范围
A9

并定义

mainLastRow = sheet.getLastRow(); 
mainLastColumn = sheet.getLastColumn();

完整代码

var numRows = mainLastRow-startRow+1;
var numCols = mainLastColumn-startColumn+1;

注释

  • 您还可以使用getDataRange()来检索范围,但您必须手动纠正function finishReport() { var ss = SpreadsheetApp.getActiveSpreadsheet(); sheet = ss.getActiveSheet(); sheetName = sheet.getName(); if (sheetName == "Main") { var startRow = 9; var startColumn=1; var mainLastRow = sheet.getLastRow(); var mainLastColumn = sheet.getLastColumn(); var numRows = mainLastRow-startRow+1; var numCols = mainLastColumn-startColumn+1; var range = sheet.getRange(startRow,startColumn,numRows,numCols); Logger.log(numRows); Logger.log(numCols); Logger.log(mainLastRow); Logger.log(mainLastColumn); if (numCols == 8) { if (numRows >= 1) { var values = range.getValues(); nextSheet = ss.getSheetByName("History record"); lastRow = nextSheet.getLastRow(); nextSheet.getRange(lastRow+1,1,numRows,8).setValues(values); sheet.deleteRows(startRow,numRows); } } } } 按照定义在单元格dataRange中开始的事实。

答案 1 :(得分:0)

我希望这对您有用。

function onOpen(e) {
  // Add a custom menu to the spreadsheet.
  SpreadsheetApp.getUi()
      .createMenu('Report')
      .addItem('Finish', 'FinishReport')
      .addToUi();
}

function FinishReport(){
  var sp = SpreadsheetApp.getActiveSpreadsheet();
  var sh = sp.getActiveSheet();
  var as =sp.getSheetByName('Main').activate(); 
  var MainRange = sp.getRange('A9:H9').activate();
  var MainLastRow = sp.getLastRow();    
  var selection = sp.getRange('A9:H' + MainLastRow).activate();
  sp.getCurrentCell().activateAsCurrentCell();
  sp.setActiveSheet(sp.getSheetByName('History record'), true);
  var lastRow = sp.getLastRow();
  var newRow = lastRow+1;  
  sp.getRange('A'+newRow+':H'+newRow).activate();
  sp.getCurrentCell().activateAsCurrentCell();  
  sp.getRange('Main!' + selection.getA1Notation()).moveTo(sp.getActiveRange());  
}

参考

Spreadsheet Custom Menu

Apps Script, SpreadsheetApp