首页 > 解决方案 > 如果将新行添加到特定列,则自动运行脚本

问题描述

我正在开发一个网络应用程序,管理员可以在其中添加居民姓名和一些关于他们的详细信息。因此,在那里添加数据后,我几乎没有用 appscript 编写公式,因此它会自动填充我的谷歌表格中的一些列,而无需手动执行。所以这里的任何人都可以帮忙,如果有一行数据添加到 B 列,它应该触发我在 appscript 中完成的编码。我附上了图像和我的代码以更好地解释自己。谢谢你。

在此处输入图像描述

代码.gs

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

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 username(){
  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName("USERNAMES");
  ss.getRange("A2").setFormula('=IF(ISBLANK(B2:B),"",(B2:B &"."&substitute(substitute(lower(C2:C),"jalan","jln")," ","")))');
  var range1 = sheet.getRange("B:B");
  var lr = getLast(range1); // Retrieve last row of column 2.
  var fillDownRange = sheet.getRange(2, 1, lr-1);
  ss.getRange("A2").copyTo(fillDownRange);
}

function noOfPaid(){
  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName("USERNAMES");
  ss.getRange("F2").setFormula("=IF(ISBLANK(B2:B), ,(COUNTIF('Payment Configuration'!A:A,A2:A) + COUNTIF('Payment Configuration'!E:E,A2:A)))");
  var range1 = sheet.getRange("B:B");
  var lr = getLast(range1); // Retrieve last row of column 2.
  var fillDownRange = sheet.getRange(2, 6, lr-1);
  ss.getRange("F2").copyTo(fillDownRange);
}

function fullAddress(){
  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName("USERNAMES");
  ss.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 fillDownRange = sheet.getRange(2, 9, lr-1);
  ss.getRange("I2").copyTo(fillDownRange);
}

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


据我所知,这一切都是错误的。

例如:该函数doPost()在工作表“PaypalData”上追加一个新行。但是新行的列(的参数e)不适合工作表上的列。更不用说工作表“PaypalData”根本没有真实数据。IMPORTRANGE(...)它通过单元格中的公式从另一个电子表格中获取数据A3。一旦你添加了范围内的东西,所有的“数据”就会消失,IMPORTRANGE那就是一团糟!

“在某些工作表上添加新行”的任务本身非常简单。而且您已经获得了或多或少正确的示例。

看起来您只是复制/粘贴了太多某人的代码,却丝毫不知道它是如何工作的。对不起,但你需要从不那么复杂的事情开始。

好吧,您可以尝试修复您的代码...

功能onEdit()

function onEdit(e) {
  if (e.source.getActiveSheet().getName() == "USERNAMES" && e.range.getColumn() == 2) {
    username(e.source);
    noOfPaid(e.source);
    fullAddress(e.source);
  }
}

功能username()

function username(ss) {
  var sheet = ss.getSheetByName("USERNAMES");
  ss.getRange("A2").setFormula('=IF(ISBLANK(B2:B),"",(B2:B &"."&substitute(substitute(lower(C2:C),"jalan","jln")," ","")))');
  var range1 = sheet.getRange("B:B");
  var lr = getLast(range1); // Retrieve last row of column 2.
  var fillDownRange = sheet.getRange(2, 1, lr-1);
  ss.getRange("A2").copyTo(fillDownRange);
}

等等...而不是:

function noOfPaid(){
  var ss = SpreadsheetApp.openByUrl(url);
...
function fullAddress(){
  var ss = SpreadsheetApp.openByUrl(url);
  ...

你需要使用:

function fullAddress(ss){
  ...  
function noOfPaid(ss){
  ...

如果此电子表格已打开,则无法通过 URL 打开电子表格。

这使您的代码在某种程度上可以正常工作。它将复制列中的公式AF以及I何时更改列B。但无论如何,它看起来很糟糕。


推荐阅读