每次运行时,如何增加脚本中引用的单元格?

时间:2019-02-09 00:46:46

标签: google-apps-script google-sheets

我有这个脚本,可以很好地工作(尽管我确定有更好的方法可以做到这一点)。

function dataTransfer() {
   var value1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BACKLOG').getRange('G18').getValue();
   var value2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('BACKLOG').getRange('AF8').getValue();
   var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('AM COMP');
   var cell1 = sheet2.getRange('D8');
   var cell2 = sheet2.getRange('D18');
   cell1.setValue(value1);
   cell2.setValue(value2);

}

当我按下创建的按钮时,此代码读取单元格中的数据并将该数据复制到另一张纸上。我需要的是每次运行脚本时从中获取数据并放入数据的单元都进行更改(有些增加了2行,有些增加了1行)。

例如:在一月份,我按下按钮,将G18(BACKLOG)中的值复制到D8(AM COMP),将AF8(BACKLOG)中的值复制到D18(AM UPSELL)。但是在二月份,我想再次按下按钮,但是这次将I18(BACKLOG)的值复制到E8(AM COMP),AF8(BACKLOG)保持不变,但是被复制到E18(AM COMP)。对于三月,他们将需要再次移动,等等。

完成此任务的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

这可能不是一个完整的解决方案,但是它应该使您知道需要做什么。您需要在对象文字中填写其余月份的值。

function dataTransfer() {
  var addr_2_ToGet,cellAddressToGet,cellAddressToSet,
      currentMonthNumber,d,innerObj,objectMap,sourceSheet,ss;

  d = new Date();//Get the current date

  currentMonthNumber = d.getMonth();//Get a number which represents 
    //the current month - 0 = January
  Logger.log('currentMonthNumber: ' + currentMonthNumber)

  objectMap = {
    0:{cellToGet:'G18',cellTwoToGet:'',cellToSet:'D8',cellTwoToSet:''},
    1:{cellToGet:'I18',cellToSet:'E8'},
    2:{cellToGet:'',cellToSet:''},
    3:{cellToGet:'',cellToSet:''},
    4:{cellToGet:'',cellToSet:''},
    5:{cellToGet:'',cellToSet:''},
    6:{cellToGet:'',cellToSet:''},
    7:{cellToGet:'',cellToSet:''},
    8:{cellToGet:'',cellToSet:''},
    9:{cellToGet:'',cellToSet:''},
    10:{cellToGet:'',cellToSet:''},
    11:{cellToGet:'',cellToSet:''}    
  }

  innerObj = objectMap[currentMonthNumber]
  Logger.log('innerObj: ' + innerObj)

  cellAddressToGet = innerObj.cellToGet;
  Logger.log('cellAddressToGet: ' + cellAddressToGet)
  addr_2_ToGet = innerObj.cellTwoToGet;

  cellAddressToSet = innerObj.cellToSet;
  Logger.log('cellAddressToSet: ' + cellAddressToSet)

  addr_2_To_Set = innerObj.cellTwoToSet;
  Logger.log('addr_2_To_Set: ' + addr_2_To_Set)

  ss = SpreadsheetApp.getActiveSpreadsheet();
  sourceSheet = ss.getSheetByName('BACKLOG');

  var value1 = sourceSheet.getRange(cellAddressToGet).getValue();
  var value2 = sourceSheet.getRange(addr_2_ToGet).getValue();

  var sheet2 = ss.getSheetByName('AM COMP');

  var cell1 = sheet2.getRange(cellAddressToSet);
  var cell2 = sheet2.getRange(addr_2_To_Set );

  cell1.setValue(value1);
  cell2.setValue(value2);

}

答案 1 :(得分:1)

每月数据传输

每个月的所有设置都巧妙地藏在名为“数据”的工作表中。

function dataTransfer() {
  var ss=SpreadsheetApp.getActive();
  var dataSh=ss.getSheetByName('DATA');
  var m=new Date().getMonth()+1;//The + 1 is to get past the header row
  var values=dataSh.getRange(1,1,dataSh.getLastRow(),dataSh.getLastColumn()).getValues();
  var hdrA=values[0];
  var valA=values[m];
  var vObj={};
  for(var i=0;i<valA.length;i++){
    vObj[hdrA[i]]=valA[i];//the hdrA is the key and the valA is the value
  }
  ss.getSheetByName(vObj.SH).getRange(vObj.RG1).setValue(ss.getSheetByName(vObj.valSH1).getRange(vObj.valRG1).getValue());
  ss.getSheetByName(vObj.SH).getRange(vObj.RG2).setValue(ss.getSheetByName(vObj.valSH2).getRange(vObj.valRG2).getValue());
  Logger.log('SH: %s,RG1: %s,valSH1: %s,valRG1: %s,RG2:%s,valSH2: %s,valRG2: %s,MONTH: %s',vObj.SH,vObj.RG1,vObj.valSH1,vObj.valRG1,vObj.RG2,vObj.valSH2,vObj.valRG2,vObj.MONTH);
}

这是“数据”表的外观:

enter image description here

当然,我只是用您提供的一个月的数据填写了表格,然后添加了month列。您可以添加更多列,然后在标题行中为其命名,这将成为从vObj中提取内容的关键。