每个月,将电子表格数据填充到下一列[需要脚本]

时间:2017-08-31 18:01:27

标签: excel google-apps-script google-sheets

我正在开发一个“仪表板”[Sample Sheet Here],其中使用Column C中的公式自动计算多个数据点(注意:样本表中未包含的公式)。

我想创建Column C数据的每月日志,其中将单元格值复制到相应Row下一个空白列

我以前使用以下脚本来垂直记录更改,并且可以使用重新调整手来获得我想要的结果。

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var s = event.source.getActiveSheet();

  var r = event.source.getActiveRange();

  if(s.getName() == "Action Items" && r.getColumn() == 2 && r.getValue()) {

    var row = r.getRow();

    var numColumns = s.getLastColumn();

    var targetSheet = ss.getSheetByName("Portion Tracking");

    if(targetSheet.getLastRow() == targetSheet.getMaxRows()) {
      targetSheet.insertRowAfter(targetSheet.getLastRow());
    }

    //Changes Start Here
    var myRow = targetSheet.getLastRow()+1;

    s.getRange(row, 1).copyTo(targetSheet.getRange(myRow,1));
    s.getRange(row, 2).copyTo(targetSheet.getRange(myRow,2));
    s.getRange(row, 3).copyTo(targetSheet.getRange(myRow,3));
  }
}

1 个答案:

答案 0 :(得分:0)

AppendColumn()

我曾经使用过here和我自己雕刻的一个功能,玩过这个想法。我有一个appendColumn()函数。

无论如何,它听起来像你可能想要的东西。您可以查看它,同时我会查看您的代码。

function appendColumn(columnA) 
{
    var ss=SpreadsheetApp.getActive();
    var sh=ss.getActiveSheet();
    var rg=sh.getDataRange();
    var vA=rg.getValues();
    var vB=transpose(vA);
    sh.clear();
    sh.getRange(1,1,vB.length,vB[0].length).setValues(vB);
    sh.appendRow(columnA);
    vD=sh.getDataRange().getValues();
    sh.clear();
    vE=transpose(vD);
    sh.getRange(1,1,vE.length,vE[0].length).setValues(vE);;
}

function transpose(a)
{
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}

为了测试它,我就这样称呼它。

function testAppendColumn()
{
  appendColumn(['',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]); 
}

我希望看到源数据。但假设它没有改变,那么我猜这种技术对你有用。

function onEdit(event) 
{
  var ss = event.source;
  var s = event.source.getActiveSheet();
  var r = event.range;
  if(s.getName() == "Action Items" && r.getColumn() == 2 && r.getValue()) 
  {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Portion Tracking");
    if(targetSheet.getLastRow() == targetSheet.getMaxRows()) 
    {
      targetSheet.insertRowAfter(targetSheet.getLastRow());
    }
    //Changes Start Here
    var myCol = targetSheet.getLastColumn()+1;
    s.getRange(row, 1).copyTo(targetSheet.getRange(1,myCol));
    s.getRange(row, 2).copyTo(targetSheet.getRange(2,myCol));
    s.getRange(row, 3).copyTo(targetSheet.getRange(3,myCol));
  }
}

我不理解将此连接到onEdit触发器的逻辑,但我假设你这样做。