google-apps-script - 谷歌脚本在运行后删除列公式
问题描述
语境
我有一个脚本,我现在找不到它的来源,但我已经根据我的需要对其进行了调整。在谷歌表中,它搜索多个条件(如果一列具有多个值之一:“未收到付款”、“payout_approved”等+状态列中为“PENDING” +特定字符串在另一列中-都在同一行),如果他们相遇,它将行状态更改为“.PAID”(带有下拉列表的列)。我添加了一个触发器,它可以工作。
其他几列在表格标题后的第一行上有公式,似乎在脚本运行后它会删除公式。之后仍然可以看到所有预期值,但是公式停止工作(如果我添加更多行,我可以看到公式停止工作,因为它们是数组公式/vlookup,根据我添加的内容以及如果我去单元格从其他工作表中获取值使用公式只有值在那里,而不是公式)。这是在那个特定时间工作的唯一脚本,我可以检查单元格的更改历史记录,看看它是否与脚本运行的时间相匹配)。
我想要什么
我希望您的帮助:
- 调整脚本以便在虚拟行之后工作,相信这可以解决问题(我认为这与“i”在某物和 LR 之间有关 - 最后一行
for (var i=0;i<LR-1;i++){
:) - 确定脚本上可能导致问题的任何其他问题,以便我了解更多相关信息并防止在未来的脚本中发生
我有的
function PendingPayment_Status() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetname = "MASTER";
var sheet = ss.getSheetByName(sheetname);
var LR = sheet.getLastRow();
var Columns = 24;
var range = sheet.getDataRange();
var data = range.getValues();
var refStatus = 'PENDING';
var refRequest = 'Payment not received. Please provide payment confirmation.';
var refCPstatus = 'payout_approved';
var refCPstatus2 = 'sent_to_finance';
var refCPstatus3 = 'special';
var refCPstatus4 ='fee_collected';
for (var i=0;i<LR-1;i++){
var cpstate = data[i+1][23];
var state = data[i+1][11];
var request = data[i+1][8];
// update the status to .PAID
if ((cpstate == refCPstatus && state == refStatus && request == refRequest) || (cpstate == refCPstatus2 && state == refStatus && request == refRequest) || (cpstate == refCPstatus3 && state == refStatus && request == refRequest) || (cpstate == refCPstatus4 && state == refStatus && request == refRequest)){
// request, sheet status and status match the reference data
data[i+1][11] = ".PAID";
//Logger.log("DEBUG: Updated sheet status for row#"+(+i+1))
}
}
range.setValues(data);
}
先感谢您。
测试电子表格- 之后添加
解决方案
另一种可能:
您可以检索有关范围的信息并使用以下组合创建新范围:
range.getHeight()
range.getWidth()
sheet.getRange()
sheet.getRange()
可以使用“A1”表示法,但也可以通过以下方式调用:
sheet.getRange(1,1,5,10)
这得到 range "A1:E10"
。IE.getRange(top left row, top left col, num of rows, num of cols)
请参阅下面如何在您的脚本中实现这一点。
我还冒昧地以更简洁的方式编写了您的代码的某些部分,尽管这只是我个人的喜好!:) 例如,我使用该array.includes()
方法来缩短您的条件语句。
function PendingPayment_Status() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet1");
var LR = sheet.getLastRow();
var Columns = 5; // changed number of columns to fit my example
var range = sheet.getDataRange(); // Always gets A1 as top left cell
var rgHeight = range.getHeight()
// you can also range.getWidth() if you want
// Here you specify *2* as the top left row
range = sheet.getRange(2,1,rgHeight - 1, Columns) // top left row, top left column, num of rows, num of columns
var data = range.getValues();
var refStatus = "PENDING"; // have to use double quotes here
var refRequest = "Payment not received. Please provide payment confirmation.";
var okCpStatuses = ["payout_approved", "sent_to_finance", "special", "fee_collected'"]
for (var i=0; i<range.getHeight(); i++) {
var cpstate = data[i][3]; // I changed index to fit my example
var state = data[i][1]; // I changed index to fit my example
var request = data[i][2]; // I changed index to fit my example
// update the status to .PAID
if (
(state == refStatus && request == refRequest) &&
( okCpStatuses.includes(cpstate) )
) {
// request, sheet status and status match the reference data
data[i][1] = ".PAID"; // I changed the index to fit my example
}
}
range.setValues(data);
}
我使用本地工作表对其进行了测试,这就是更改列索引号的原因,但是由于我没有您的工作表,因此无法使用您的工作表进行测试。
也许下次您可以提供自己的示例表,这会更快:)
参考:https ://developers.google.com/apps-script/reference/spreadsheet/range
推荐阅读
- xml - 为什么我的 XSLT 计数器变量没有更新?
- linear-regression - 在线性回归问题中添加特征
- amazon-web-services - 在安全组中添加/替换来自不同区域的 ec2 实例的公共 IP
- kubernetes - Kubernetes 仪表板未知字段“seccompProfile”和错误 503
- java - 将 picocli 与 picocli-shell-jline3 和配置的 java 模块一起使用会导致未命名的模块读取包编译错误
- python-3.x - 由于没有看到 HDF5,表库在安装时出错
- asp.net - 如何从asp.net vb.net中的sql查询中的对象获取值
- c# - 如何使用来自不同类的变量值 WPF C#
- html - 如何使用剪辑路径+动画来显示面板上下文
- angular - 如何在 Angular 12 中使用 href="/page"?