【问题标题】:Modifying OnEdit function修改 OnEdit 函数
【发布时间】:2021-05-24 00:17:18
【问题描述】:

我是 AppScript 的初学者。我正在为 OnEdit 开发一个代码,其中的函数是这样的

function onEdit(e) {
  
  if(SpreadsheetApp.openByUrl(url).getActiveSheet == "USERNAMES" && e.range.columnStart == 2 )
  {
    formulasheets();
  }

}

但它不起作用我在 B 列中编辑了一些内容。我希望 onedit 函数在对 B 列进行修改时工作。有人可以帮助我吗?

代码.gs

var url = "https://docs.google.com/spreadsheets/d/1bM8l6JefFsPrlJnTWf56wOhnuSjdIwg3hMbY1tN1Zp8/edit#gid=531487589";

function onEdit(e) {
  
  if(SpreadsheetApp.openByUrl(url).getActiveSheet == "USERNAMES" && e.range.columnStart == 2 )
  {
    formulasheets();
  }

}

function doPost(e) {

  var rowData = [];

  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName("PaypalData");

  rowData.push(new Date(e.parameter.payment_date));
  rowData.push(e.parameter.item_number);
  rowData.push(e.parameter.option_selection1);
  rowData.push(e.parameter.payment_status);
  rowData.push(e.parameter.payment_gross);
  rowData.push(e.parameter.mc_currency);
  rowData.push(e.parameter.payment_fee);
  rowData.push(e.parameter.first_name);
  rowData.push(e.parameter.last_name);
  rowData.push(e.parameter.payer_email);
  rowData.push(e.parameter.residence_country);
  rowData.push(e.parameter.txn_id);
  
  sheet.appendRow(rowData);
}

function getLast(range) {
    var getResult = function(range) {
        if (!((range.getNumRows() > 1 && range.getNumColumns() == 1) || (range.getNumRows() == 1 && range.getNumColumns() > 1))) {
            throw new Error("Please input one row or one column.");
        }
        var v = Array.prototype.concat.apply([], range.getValues());
        var f = Array.prototype.concat.apply([], range.getFormulas());
        var i;
        for (i = v.length - 1; i >= 0; i--) {
            if (v[i] != "" || f[i] != "") break;
        }
        return i + 1;
    };
    if (Array.isArray(range)) {
        return range.map(function(e) {
            return getResult(e);
        });
    } else {
        try {
            range.getA1Notation();
        } catch (e) {
            throw new Error("Inputted value is not a range.");
        }
        return getResult(range);
    }
}

function formulasheets(){
  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName("USERNAMES");
  sheet.getRange("A2").setFormula('=B2:B &"."&substitute(substitute(lower(C2:C),"jalan","jln")," ","")');
  sheet.getRange("F2").setFormula("=COUNTIF('Payment Configuration'!A:A,A2:A) + COUNTIF('Payment Configuration'!E:E,A2:A)");
  sheet.getRange("I2").setFormula('=join(", ",{B2,UPPER(C2),"BANDAR PUTERI KLANG"})');
  var range1 = sheet.getRange("B:B");
  var lr = getLast(range1); // Retrieve last row of column 2.
  var fillDownRangecolumnA = sheet.getRange(2, 1, lr-1);
  var fillDownRangecolumnF = sheet.getRange(2, 6, lr-1);
  var fillDownRangecolumnI = sheet.getRange(2, 9, lr-1);
  sheet.getRange("A2").copyTo(fillDownRangecolumnA);
  sheet.getRange("F2").copyTo(fillDownRangecolumnF);
  sheet.getRange("I2").copyTo(fillDownRangecolumnI);
}

【问题讨论】:

  • 它应该可以工作,除非你正在做一些需要许可的事情,在这种情况下你需要一个可安装的 onedit 触发器并且你需要提供授权。
  • @Cooper 我已经给了权限,兄弟。我给你我的谷歌表格的链接你介意检查一下吗
  • @Cooper docs.google.com/spreadsheets/d/… - 链接到谷歌表格
  • 你昨天已经问过这个问题了,看起来你不在乎答案:stackoverflow.com/questions/67648131/…你怎么了,兄弟?

标签: javascript google-apps-script google-sheets


【解决方案1】:

为什么需要openByUrl()?您可以通过e.source访问当前工作表:

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  if (sheet.getName() == "USERNAMES" && e.range.getColumn() == 2) {
  formulasheets(sheet)
  }
}
function formulasheets(sheet){
  sheet.getRange("A2").setFormula('=B2:B &"."&substitute(substitute(lower(C2:C),"jalan","jln")," ","")');
  sheet.getRange("F2").setFormula("=COUNTIF('Payment Configuration'!A:A,A2:A) + COUNTIF('Payment Configuration'!E:E,A2:A)");
  sheet.getRange("I2").setFormula('=join(", ",{B2,UPPER(C2),"BANDAR PUTERI KLANG"})');
  var range1 = sheet.getRange("B:B");
  var lr = getLast(range1); // Retrieve last row of column 2.
  var fillDownRangecolumnA = sheet.getRange(2, 1, lr-1);
  var fillDownRangecolumnF = sheet.getRange(2, 6, lr-1);
  var fillDownRangecolumnI = sheet.getRange(2, 9, lr-1);
  sheet.getRange("A2").copyTo(fillDownRangecolumnA);
  sheet.getRange("F2").copyTo(fillDownRangecolumnF);
  sheet.getRange("I2").copyTo(fillDownRangecolumnI);
}

你甚至不需要函数formulasheets()。您可以在onEdit() 函数中添加ist 行。

而且每次都重新填充所有列(A、F、I)并不是最佳做法,因为 B 列中的某些内容正在发生变化。仅更新当前行上的三个单元格就足够了。可以从e对象获取的当前行:

var row = e.range.getRow();

在这种情况下,您甚至可能不需要函数 getLast()

所以,OP 中的所有代码都可以归结为:

function onEdit(e) {
  if (e.source.getActiveSheet().getName() != "USERNAMES") return;
  if (e.range.getColumn() != 2) return;
  var sheet = e.source
  var row = e.range.getRow();
  var A = '=B2:B &"."&substitute(substitute(lower(C2:C),"jalan","jln")," ","")';
  var F = "=COUNTIF('Payment Configuration'!A:A,A2:A) + COUNTIF('Payment Configuration'!E:E,A2:A)";
  var I = '=join(", ",{B2,UPPER(C2),"BANDAR PUTERI KLANG"})';
  sheet.getRange("A"+row).setFormula(A);
  sheet.getRange("F"+row).setFormula(F);
  sheet.getRange("I"+row).setFormula(I);
}

【讨论】:

  • @YutiKhristich 这就是我想要的。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多