Google apps script 我对onEdit()函数有问题

Google apps script 我对onEdit()函数有问题,google-apps-script,google-sheets,triggers,Google Apps Script,Google Sheets,Triggers,我是Google sheet应用程序脚本的初学者,因为我在实习期间第一次需要它。我一直在寻找其他许多问题的答案,但我没有找到我正在寻找的神圣答案 基本上,我想做的是,我有一个电子表格来管理我所在公司的股票和订单。所以我正在慢慢地尝试改进它,我想使用几个应该由onEdit()触发的函数。我的问题是,我已经单独尝试了这些函数,它们正在工作,但是当我将它们放在同一个onEdit()函数中时,有一个不工作 function addRow(lRow) { if ( lRow != null ) {

我是Google sheet应用程序脚本的初学者,因为我在实习期间第一次需要它。我一直在寻找其他许多问题的答案,但我没有找到我正在寻找的神圣答案

基本上,我想做的是,我有一个电子表格来管理我所在公司的股票和订单。所以我正在慢慢地尝试改进它,我想使用几个应该由
onEdit()触发的函数。我的问题是,我已经单独尝试了这些函数,它们正在工作,但是当我将它们放在同一个
onEdit()
函数中时,有一个不工作

function addRow(lRow) {
  if ( lRow != null ) {
    var ss = SpreadsheetApp.getActive()
    var sh = ss.getActiveSheet(); 
    var lCol = sh.getLastColumn(); 
    var range = sh.getRange(lRow,1, 1, lCol);
    sh.insertRowsAfter(lRow, 1);
    range.copyTo(sh.getRange(lRow+1, 1, 1, lCol), {formatOnly:true});
  }  
}
function lastValue(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
  var values = SpreadsheetApp.getActiveSheet().getRange("K1:K"+lastRow).getValues();

  for (; values[lastRow - 1] == "" && lastRow > 0; lastRow--) {}
  return lastRow;
}
function onEdit(){
  myOnEdit()
}
function myOnEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  if( s.getName() == "Commandes V3" ) { //checks that we're on Commandes V3 or not
    var r = s.getActiveCell();
    if( r.getColumn() == 23 ) { //checks that the cell being edited is in column W
      var nextCell = r.offset(0, 1);
      if( nextCell.getValue() === '' ) //checks if the adjacent cell is empty or not?
        nextCell.setValue(new Date());
      } 
    }
  }
  var ss = SpreadsheetApp.getActive()
  var sheet = ss.getActiveSheet();
  var r = sheet.getRange("J1:J")
  for(i = 2 ; i <= 500 ; i++) {
    if (sheet.getRange("J"+ i).getValue() == true ) {
      var derLigne = SpreadsheetApp.getActiveSheet().getRange("AR54").getValue()
      var l = derLigne-1
      var ai = SpreadsheetApp.getActiveSheet().getRange("A" + i).getValue()
      var bi = SpreadsheetApp.getActiveSheet().getRange("B" + i).getValue()
      var ci = SpreadsheetApp.getActiveSheet().getRange("C" + i).getValue()
      var di = SpreadsheetApp.getActiveSheet().getRange("D" + i).getValue()
      var ei = SpreadsheetApp.getActiveSheet().getRange("E" + i).getValue()
      var fi = SpreadsheetApp.getActiveSheet().getRange("F" + i).getValue()
      var gi = SpreadsheetApp.getActiveSheet().getRange("G" + i).getValue()
      addRow(l)
      SpreadsheetApp.getActiveSheet().getRange("A" + derLigne).setValue(ai)
      SpreadsheetApp.getActiveSheet().getRange("B" + derLigne).setValue(bi)
      SpreadsheetApp.getActiveSheet().getRange("K" + derLigne).setValue(ci)
      SpreadsheetApp.getActiveSheet().getRange("L" + derLigne).setValue(di)
      SpreadsheetApp.getActiveSheet().getRange("M" + derLigne).setValue(ei)
      SpreadsheetApp.getActiveSheet().getRange("N" + derLigne).setValue(fi)
      SpreadsheetApp.getActiveSheet().getRange("O" + derLigne).setValue(gi)
      SpreadsheetApp.getActiveSheet().deleteRow(i+1)
    }
  }
  SpreadsheetApp.getActiveSheet().getRange("AR54").setValue(lastValue("K")+1);
函数addRow(lRow){
如果(lRow!=null){
var ss=SpreadsheetApp.getActive()
var sh=ss.getActiveSheet();
var lCol=sh.getLastColumn();
var范围=sh.getRange(lRow,1,1,lCol);
sh.insertRowsAfter(lRow,1);
copyTo(sh.getRange(lRow+1,1,lCol),{formatOnly:true});
}  
}
函数lastValue(列){
var lastRow=SpreadsheetApp.getActiveSheet().getMaxRows();
var values=SpreadsheetApp.getActiveSheet().getRange(“K1:K”+lastRow).getValues();
对于(;值[lastRow-1]=”&&lastRow>0;lastRow--){}
返回最后一行;
}
函数onEdit(){
myOnEdit()
}
函数myOnEdit(){
var s=SpreadsheetApp.getActiveSheet();
如果(s.getName()==“commandesv3”){//检查我们是否在commandesv3上
var r=s.getActiveCell();
如果(r.getColumn()==23){//检查正在编辑的单元格是否在W列中
var nextCell=r.offset(0,1);
if(nextCell.getValue()='')//检查相邻单元格是否为空?
setValue(新日期());
} 
}
}
var ss=SpreadsheetApp.getActive()
var sheet=ss.getActiveSheet();
var r=表的getRange(“J1:J”)

对于(i=2;i当使用on-edit触发器时,最好使用事件对象,而不是像
getActive()
getActiveCell()
这样的“获取活动”方法,但这可能需要使用函数来提供模拟事件对象

另外,使用
const
而不是
var
可能更方便,以防止重新声明不应重新声明的变量。我提到这一点是因为代码将不同的对象分配给
r
,这可能会使您和其他人对该变量的用途感到困惑

function debugOnEdit(){
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const name = 'Commandes V3';
  const e = {
    source: spreadsheet,
    range: spreadsheet.getSheetByName(name).getRange(1,23)
  }
  onEdit(e);
}

function onEdit(e){
  myOnEdit(e);
}

function myOnEdit(e){
  const s = e.range.getSheet();
  const r = e.range;
  ...
}
另一方面,
onEdit
可能并不总是被触发,即用户在上一次
onEdit
执行完成之前进行多次编辑,它应该尽可能快,为了实现这一点,对
SpreadsheetApp
方法的调用次数应该最小化和优化

  • 不要使用
    getMaxRows()
    而是使用
    getLastRow()
  • 不要使用多个
    getValue()
    /
    setValue()
    使用
    getValues()
    /
    setValues()
相关的


用于在单元格中输入日期的部分如何不起作用?您是否遇到错误?值不正确?值输入错误的单元格?当我在单元格中输入本应激活它的内容(在W列中)时,什么都不会发生。因此我不知道代码有什么问题。因为如果我在其他gsheet中使用相同的代码(通过替换工作表的名称)它工作得很好,日期出现在NearBy的单元格中我在论坛上找到了使用onEdit()命名要触发的函数的提示,而不仅仅是直接使用onEdit()中的行,我真的不知道它是否有效。无论有没有这些提示,函数本身都不会激活。Thomas我终于有机会查看了你的代码,据我所知,你发布的内容并不完整。特别是myOnEdit函数之后的代码似乎不属于任何函数。你能试着编写一个非常简单的脚本只向您想要的单元格写入一些值?可能有某种保护?