Google apps script 我对onEdit()函数有问题
我是Google sheet应用程序脚本的初学者,因为我在实习期间第一次需要它。我一直在寻找其他许多问题的答案,但我没有找到我正在寻找的神圣答案 基本上,我想做的是,我有一个电子表格来管理我所在公司的股票和订单。所以我正在慢慢地尝试改进它,我想使用几个应该由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 ) {
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函数之后的代码似乎不属于任何函数。你能试着编写一个非常简单的脚本只向您想要的单元格写入一些值?可能有某种保护?