1

如果在第 5 列中输入了任何信息,我需要将该行数据复制到另一个电子表格。我的函数中的第一个 if() 用于其他内容,它在将任何信息输入第 4 列时对数据进行排序,这有效,但我需要另一个 if() 才能工作,但它没有,我看过其他问题,但我找不到适合我情况的答案。

function onEdit(event) {
  var sheet=event.source.getActiveSheet();
  var editedCell=sheet.getActiveCell();
  var columnToSortBy=4;
  var columnToArchive=5;
  var tableRange= "A2:F!";

  if(editedCell.getColumn() == columnToSortBy){
    var range=sheet.getRange(tableRange);
    range.sort( {column : columnToSortBy} );
  }
  else{
    if(editedCell.getColumn() == columnToArchive){
      var rowToBeMoved=editedCell.getRow();
      var rangeToBeMoved=sheet.getRange("A" + rowToBeMoved + ":F" + rowToBeMoved);
      var values=rangeToBeMoved.getValues();
      var archiveSpreadSheet=SpreadsheetApp.openById("0AroBvchobu2edHNXQ3ZUQjI5TWJtWWZwa1UtcExPNnc");
      var archiveSheet=archiveSpreadSheet.getSheetByName("archive");
      archiveSheet.appendRow(values);
    }
  }
}

我已经确定问题出在第二个 if 块中的最后三行。似乎在“var values=rangeToBeMoved.getValues();”行之后,脚本停止运行,因为如果我在该行之后或之前的任何位置放置 Browser.msgBox(“hi”),则会出现该消息,但如果我把它放在下一行之后,它不会出现。问题出在 .openById() 上?帮助!

4

1 回答 1

1

这段代码正在工作:

更新:10-01-2013
您需要使用 columnIndex 而不是 getColumn:

function onEdit(event) {
  // set items for current spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var row = sh.getActiveRange().getRowIndex();
  var col = sh.getActiveRange().getColumnIndex();
  var columnToSortBy=4;
  var columnToArchive=5;
  var tableRange= "A2:F!";

  if(col == columnToSortBy){
    var range=sh.getRange(tableRange);
    range.sort( {column : columnToSortBy} );
  }

  if(col == columnToArchive){   
    var rangeToBeMoved=sh.getRange("A" + row + ":F" + row);
    var values=rangeToBeMoved.getValues();
    var archiveSpreadSheet=SpreadsheetApp.openById("your key");
    var archiveSheet=archiveSpreadSheet.getSheetByName("Sheet1");        
    archiveSheet.appendRow(values[0]);
  }
}    

appendRow唯一接受一维数组。这getRange将产生一个二维数组。添加一个零(在方括号之间)将使其成为一维数组。

于 2013-01-09T21:46:28.213 回答