Google apps script 如何在谷歌工作表中创建一个计数器来计算一个计算单元改变值的次数?
我是一个初学者,需要编写一个脚本来计算一个单元格的次数,计算公式中的值(无用户输入)在一天内更改值,然后在午夜将计数重置为0 我曾尝试使用onEdit代码,但它只适用于用户输入的更改,而不考虑公式基于其他值更改单元格值的情况 以下是一个指向示例电子表格的链接- H列有一个信号(买入或卖出),该信号是根据价格计算的,并且可以在一天内变化。 代码应显示信号在一天中的买入或卖出次数,然后在天结束时重置 任何帮助都将不胜感激,因为我在这件事上陷入了困境 编辑 我提出了这段代码,它处理一行数据:Google apps script 如何在谷歌工作表中创建一个计数器来计算一个计算单元改变值的次数?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我是一个初学者,需要编写一个脚本来计算一个单元格的次数,计算公式中的值(无用户输入)在一天内更改值,然后在午夜将计数重置为0 我曾尝试使用onEdit代码,但它只适用于用户输入的更改,而不考虑公式基于其他值更改单元格值的情况 以下是一个指向示例电子表格的链接- H列有一个信号(买入或卖出),该信号是根据价格计算的,并且可以在一天内变化。 代码应显示信号在一天中的买入或卖出次数,然后在天结束时重置 任何帮助都将不胜感激,因为我在这件事上陷入了困境 编辑 我提出了这段代码,它处理一行数据: func
function Counter(e) {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Counter");
var r = s.getRange("H2");
var v= r.getValue();
var h = s.getRange("N2").getValue();
if(v !== h) {
var sCounter = s.getRange("I2");
var timestamprange = s.getRange("J2")
var formattedDate = Utilities.formatDate(new Date(), "GMT+5", "yyyy-MM-dd HH:mm:ss");
var counter = sCounter.getValue();
if(counter === 0) {
counter = 1;
} else {
counter ++;
}
sCounter.setValue(counter);
timestamprange.setValue(formattedDate)
;}
s.getRange(2, 14).setValue(v)
}
如何调整代码以使“H2:H51”、“I2:I51”、“J2:J51”范围内的代码相同
编辑2:
我自己尝试了一下,得出了这个代码,但它不起作用:
function Test() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("Counter");
var newvalues = s.getRange("H2:H51").getValues();
var oldvalues = s.getRange("N2:N51").getValues();
for(n=0;n<newvalues.length;++n){
var nv = newvalues[n][0] ;
var o = oldvalues[n][0] ;
if(nv !== o) {
var sCounter = s.getRange("I2:I51");
var timestamprange = s.getRange("J2:J51");
var formattedDate = Utilities.formatDate(new Date(), "GMT+5", "yyyy-MM-dd HH:mm:ss");
var counter = sCounter.getValues();
if(counter[n][0] === 0) {
counter[n][0] = 1;
} else {
counter[n][0] ++;
}
sCounter.setValues(counter[n][0]);
timestamprange.setValue(formattedDate);
}
}
s.getRange("N2:N51").setValues(newvalues)
}
功能测试(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var s=ss.getSheetByName(“计数器”);
var newvalues=s.getRange(“H2:H51”).getValues();
var oldvalues=s.getRange(“N2:N51”).getValues();
对于(n=0;n我已经想出了一个适合我的答案,我确信它不是最优的,但它完成了工作)我设置了一个每分钟运行一次的触发器。如果计数器改变了值,它还会在下一列中添加日期和时间,以跟踪最后的改变,如果有人需要的话。
非常欢迎对代码进行升级
工作守则:
function Counter() {
var ss=SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getSheetByName("DataStructured");
var newvalues = s.getRange("H2:H51").getValues();
var oldvalues = s.getRange("N2:N51").getValues();
for(n=0;n<newvalues.length;++n){
var nv = newvalues[n][0];
var o = oldvalues[n][0];
if(nv !== o) {
var sCounter = s.getRange("I2:I51");
var timestamprange = s.getRange("J2:J51")
var formattedDate = Utilities.formatDate(new Date(), "GMT+5", "yyyy-MM-dd HH:mm:ss");
var counter = sCounter.getValues();
if(counter[n][0] === 0) {
counter[n][0] = 1;
} else {
counter[n][0] ++;
}
sCounter.setValues(counter);
s.getRange("J"+(n+2)).setValue(formattedDate);
}
}
s.getRange("N2:N51").setValues(newvalues)
}
函数计数器(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var s=ss.getSheetByName(“数据结构”);
var newvalues=s.getRange(“H2:H51”).getValues();
var oldvalues=s.getRange(“N2:N51”).getValues();
对于(n=0;nw)单元格的值基于什么?如果这些单元格相同/受控,那么您也可以使用OneEdit跟踪这些单元格?运行总计应表示总变化。卖出的值基于价差。下面是H列的公式,精确为-=如果(E2>B2,“买入”,如果(E2你需要一个脚本是的,这就是我来这里的原因:)请详细介绍您的场景。H列中有多少行数据?电子表格重新计算需要多长时间?使用简单计数器,处理每行实时数据需要多长时间?您可以接受的绝对最短时间检查频率是多少?如果,将使用时间驱动的事件(触发器)。尽管您必须调整执行频率和总执行时间。