2017-07-30 73 views
0

的时刻保持价值,我自己建了一个相当花哨财务跟踪的电子表格,但遇到了以下问题:谷歌应用程序脚本:转换货币,但是从转换

我跟踪与两个值我的费用:量和货币。

然后,在下一列中,我使用GOOGLEFINANCE()将这些值转换为我的本国货币(欧元)。

我的公式是这样的: IF(B2 = "EUR"; A2; A2*GOOGLEFINANCE("CURRENCY:" & B2 &"EUR"))

如果该行的货币(B柱)是欧元,不做任何转换,只是使用值从A柱。

如果B不是欧元,则取B中的货币并将A中的货币值从该货币转换为欧元。

问题是这是不断更新。在这一刻没问题的时候,但如果我在几年内回过头来看,一些价值可能会与原来的汇率有很大差异。

我想要做的就是用今天的汇率填写该字段并保留这样的值(即静态而不是动态)。

有没有人有这方面的经验?我想这也是建立股票价格记录表的常见问题。

回答

0

我也有很多金融跟踪表的,你是对的,冻结返回的值是一个共同的需要。下面的脚本被设置为运行单元格B2的onEdit。 (你可以改变它的列B)。它使用偏移量获得单元格C2。它会得到公式计算公式计算公式计算结果的显示值,并用该值覆盖公式。由于公式消失,它不会重新计算。

function onEdit(e) { 
    if(e.range.getA1Notation()=="B2"){ 
    freeze(e.range.getA1Notation()); 
    }} 
function freeze(c){ 
    var ss =SpreadsheetApp.getActiveSpreadsheet() 
    var s=ss.getActiveSheet() 
    var activeCell =c 
    var oc =SpreadsheetApp.getActiveRange().offset(0, 1).getA1Notation() 
    var val=s.getRange(oc).getDisplayValue() 
    s.getRange(oc).setValue(val); 
} 

下面是一个改进版本来检查在片材和处理所有列B,不只是B2的。将B2中的公式更改为此并复制下来:

=IF(or(B2 = "EUR",B2=""), A2, A2*GOOGLEFINANCE("CURRENCY:" & B2 &"EUR")) 

然后将onEdit更改为此。根据需要更改表名称:

function onEdit(e){ 
    var sheet = e.source.getActiveSheet().getName() 
    var c = e.range.getA1Notation() 
    var col=e.range.getColumn() 
    var lcval=e.value.toLowerCase()//to lower case to ignore case. 
    if(lcval==""){return} 
    if(sheet=="Sheet1" && col==2 && lcval != "eur"){ //Change sheet name as needed. 
    freeze(c)//call freeze wuth active cell address. 
    } 
}