【问题标题】:Automatically run the script if a new row is added to a specific column [duplicate]如果将新行添加到特定列,则自动运行脚本[重复]
【发布时间】:2021-08-11 08:17:56
【问题描述】:

我正在开发一个网络应用程序,管理员可以在其中添加居民姓名和一些关于他们的详细信息。因此,在那里添加数据后,我几乎没有用 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);
}

【问题讨论】:

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


【解决方案1】:
function onEdit(e) {
  if(SpreadsheetApp.getActiveSheet().getSheetName() === "USERNAMES" && e.range.columnStart == 2) {
    // run functions
  }
}

【讨论】:

  • @WaiHaLee Bro 我尝试了编码,但不知何故,它对我来说显示了一个错误兄弟。你能帮我解决问题吗。 script.google.com/home/projects/… - 链接到我的 appscript
  • 错误是什么?
  • 我的 google 表格一直在自行加载,兄弟。突然,那里没有显示任何公式。就像床单在波动
  • docs.google.com/spreadsheets/d/… - 链接到我的谷歌表格
  • 我打开了编辑兄弟的链接,你介意看看问题
【解决方案2】:

据我所知,一切都错了。

例如:函数doPost() 在工作表“PaypalData”上追加一个新行。但是新行的列(e 的参数)不适合工作表上的列。更不用说工作表“PaypalData”根本没有真实数据。它通过单元格A3 中的IMPORTRANGE(...) 公式从另一个电子表格中获取数据。一旦你在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 打开电子表格。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2018-02-14
    • 2022-01-15
    • 2018-09-08
    • 2021-11-14
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多