javascript - 如果将新行添加到特定列,则自动运行脚本
问题描述
我正在开发一个网络应用程序,管理员可以在其中添加居民姓名和一些关于他们的详细信息。因此,在那里添加数据后,我几乎没有用 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);
}
解决方案
据我所知,这一切都是错误的。
例如:该函数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 打开电子表格。
这使您的代码在某种程度上可以正常工作。它将复制列中的公式A
,F
以及I
何时更改列B
。但无论如何,它看起来很糟糕。
推荐阅读
- haskell - 如何使用 Shake 分配 PTY?
- javascript - 在第 n 个而不是第一个使用 async 和 await ?
- excel - 过滤表格时如何在 IE(非默认浏览器)中使 Excel 打开超链接
- libreoffice-calc - 在 Starbasic 宏中,在 LibreCalc 中,我无法将字符串作为表达式传递
- php - 如何在 WordPress 仪表板的管理栏中排列列?
- c++ - 如果函数会返回一个指向 char 数组的指针而我不会使用它怎么办?
- node.js - mocha 和 chai 测试期间的 Node.js api 端点超时
- rendering - HTML css - 谷歌浏览器和边缘是一个像素
- linux - 在添加从 RPM 移植的 pkg 后,JFrog 工件和 MergeList /var/lib/apt/lists "(NewVersion2)" 的问题
- android - Android Studio:等待设备时出错:AVD Pixel_3_API_24 的模拟器进程已终止。在配备 M1 芯片的 Mac Book Pro 上