有没有一种方法可以显示基于日期的不同值?

时间:2018-12-30 20:46:51

标签: google-apps-script google-sheets

我试图垂直捕获数据并水平显示数据,每个值之间都有一列。

以下是示例数据:

这就是我要完成的工作:

我已经尽力用尽我目前所知道的一切来解决这个问题,但是我似乎无法理解,我相信这是一个容易解决的问题。我只是对Google的关键字不太满意。

ps:只是注意到我还有一些隐藏的列。在这种情况下,让我们假设示例中的列是A / B / C / D / E。

1 个答案:

答案 0 :(得分:0)

将多行中的相同日期汇总到同一行中的单独列中

我不完全理解您是如何从示例1转到示例2的,但是很显然,您希望将具有相同日期的多行汇总为一行中的多列,这就是该函数的示例。 / p>

我猜想,一旦您对尝试完成的工作以及应该如何工作提供了更好的解释,那么您可能会得到一些更容易弄清楚的答案。

无论如何,如果您愿意,我可以提供此解决方案。我正在使用键/值对象来跟踪相同日期的数量,如果dObj.hasOwnProperty()方法返回false,那么它也有助于识别新日期。

代码:

Queue<GameObject> Capsules;
void Start()
{
    Capsules = new Queue<GameObject>();
}

public GameObject caps;
private void createObject()
{
    caps = GameObject.CreatePrimitive(PrimitiveType.Capsule);
    Capsules.Enqueue(caps);
}

运行脚本之前的示例电子表格:

enter image description here

运行脚本后的示例电子表格:

第2列中每个连续的相同日期的值放在该日期出现的第一行的下一列中。最后,删除column2。

enter image description here

我玩过这个版本,这个版本不需要其他相同的日期即可连续。它为每个日期创建一个唯一的currentRow,并且该当前行用于所有剩余的相同日期,即使它们出现在其他剩余日期之后。即不需要对日期进行排序。

function condenseDates(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('sheet name');//you need to change this for the appropriate sheet name
  var rg=sh.getDataRange();//get all data values including headers
  var vA=rg.getValues();
  var dObj={};//data object which is used to identify new new dates and keep track of the run columns for identical dates.
  var d=0;//delete counter
  for(var i=1;i<vA.length;i++){
    if(dObj.hasOwnProperty(vA[i][0])) {//if it does not have this property then it is a new date
      dObj[vA[i][0]]=Number(dObj[vA[i][0]])+1;//if it does have this property then increment the DObj value which keeps track of the run column it will go into
      var rg=sh.getRange(1,2 + Number(dObj[vA[i][0]]));//this is the header column cell for this dObj column
      if(rg.isBlank()){//if it is blank then write a new one
        rg.setValue('Run' + dObj[vA[i][0]]);
      }
      sh.getRange(Number(dObj.currentRow),2 + Number(dObj[vA[i][0]])).setValue(vA[i][1]);//put value for this line in the appropriate column in the currentRow   
      sh.deleteRow(i-d+1);//delete this line
      d++;//increment the delete counter
    }else{//it is a new date
      dObj[vA[i][0]]=1;
      dObj['currentRow']=i-d+1;//Current Data Row
      var rg=sh.getRange(1,3);
      if(rg.isBlank()){//if header has no label in the first run column then write it
        rg.setValue('Run' + 1);
      }
      sh.getRange(Number(dObj.currentRow),2 + Number(dObj[vA[i][0]])).setValue(vA[i][1]);//write data in the appropriate column in this case it is always column3 
    }
  }
  sh.deleteColumn(2);
}