Google App脚本:转换货币,但保留转换时的价值

时间:2017-07-30 14:26:57

标签: google-sheets google-finance

我自己构建了一个相当花哨的财务跟踪电子表格,但遇到了以下问题:

我用两个值跟踪我的费用:金额和货币。

然后,在下一列中,我使用We could be wrong, but this one looks like it might be an issue with missing quotes. Always quote template expression brackets when they start a value. For instance: with_items: - {{ foo }} Should be written as: with_items: - "{{ foo }}" 将这些值转换为我的本机货币(欧元)。

我的公式如下: GOOGLEFINANCE()

如果此行的货币(B列)为欧元,则不进行任何转换,只使用A列中的值。

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

问题是这是不断更新的。目前这是可以的,但如果我在几年内回到它,一些价值可能会与原来的汇率大不相同。

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

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

1 个答案:

答案 0 :(得分:0)

我也有很多财务跟踪表,你是对的,冻结返回值是一个常见的需求。以下脚本设置为运行在单元格B2的编辑上。 (您可以将其更改为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.
  }
}