我试图垂直捕获数据并水平显示数据,每个值之间都有一列。
以下是示例数据:
这就是我要完成的工作:
我已经尽力用尽我目前所知道的一切来解决这个问题,但是我似乎无法理解,我相信这是一个容易解决的问题。我只是对Google的关键字不太满意。
ps:只是注意到我还有一些隐藏的列。在这种情况下,让我们假设示例中的列是A / B / C / D / E。
答案 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);
}
运行脚本之前的示例电子表格:
运行脚本后的示例电子表格:
第2列中每个连续的相同日期的值放在该日期出现的第一行的下一列中。最后,删除column2。
我玩过这个版本,这个版本不需要其他相同的日期即可连续。它为每个日期创建一个唯一的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);
}