我一直在尝试编写一些代码,这些代码基于一些简单的公式使用字符串向下看一列。我似乎无法识别不同的数据集并将其粘贴到我想要的位置。
我尝试用几种不同的方式重写代码,这些方式可以查看所有数据,并且仅将目标行偏移1。但是它无法识别出它拉不同的数据。
下面是有效的代码。它的作用是从第一列第二行开始(我的数据从此处开始)。数据是类似的列表;
A
1 Customer1
2 item1
3 item2
4 Item3
5
6 Customer2
7 Item1
我在这些单元格中具有的公式只是连接了其他一些单元格。 使用循环,它遍历A列并找到空白。然后,它将“中断”它停在的任何数字(该单元格的数字A1表示法),然后查找这些单元格的值并将它们转置到正确行中的另一张纸中。
该代码运行得最好的问题是它不会将任何单元格读取为空白 (因为存在公式?),并将它们全部转置到同一行。
function transpose(){
var data = SpreadsheetApp.getActiveSpreadsheet();
var input =data.getSheetByName("EMAIL INPUT");
var output = data.getSheetByName("EMAIL OUTPUT");
var lr =input.getLastRow();
for (var i=2;i<20;i++){
var cell = input.getRange(i, 1).getValue();
if (cell == ""){
break
}
}
var set = input.getRange(2, 1, i-1).getValues();
output.getRange(2,1,set[0].length,set.length) .
.setValues(Object.keys(set[0]).map ( function (columnNumber) {
return set.map( function (row) {
return row[columnNumber];
});
}));
Logger.log(i);
Logger.log(set);
}
我需要代码做的是浏览所有数据,并按条件将数据集分开。 然后将该信息放在另一张纸上。每组数据(或数组)将进入不同的行。每个组件都填满整个列([[customer1”,“ Item1”,“ Item2”]。
编辑: 是否可以从单个列中提取不同的数据集并将其转换为数组?我相信,如果我使用“追加”将我的不同数组转置到需要的位置,那么能够做到这一点将起作用。
答案 0 :(得分:0)
测试单元格的长度。即使是公式,它也会根据该值评估结果。
if (cell.length !=0){
// the cell is NOT empty, so do this
}
else
{
// the cell IS empty, so do this instead
}
额外 该代码以您的目标为基础,并完成了数据的转置。
该代码效率不高,因为它在循环内包含getRange
和setValues
。
理想情况下,可以/应该在一个命令中设置整个输出范围,但是对此的(未回答)挑战是提前知道每个连续范围的最大行数,以便可以为少于最大行数的行设置空白值。行。
这将是值得进行的更改。
function so5671809203() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var inputsheetname = "EMAIL_INPUT";
var inputsheet = ss.getSheetByName(inputsheetname);
var outputsheetname = "EMAIL_OUTPUT";
var outputsheet = ss.getSheetByName(outputsheetname);
var inputLR =inputsheet.getLastRow();
Logger.log("DEBUG: the last row = "+inputLR);
var inputrange = inputsheet.getRange(1, 1,inputLR+1);
Logger.log("the input range = "+inputrange.getA1Notation());
var values = inputrange.getValues();
var outputval=[];
var outputrow=[];
var counter = 0; // to count number of columns in array
for (i=0;i<inputLR+1;i++){
Logger.log("DEBUG: Row:"+i+", Value = "+values [i][0]+", Length = "+values [i][0].length);
if (values [i][0].length !=0){
// add this to the output sheet
outputrow.push(values [i][0]);
counter = counter+1;
Logger.log("DEBUG: value = "+values [i][0]+" to be added to array. New Array Value = "+outputrow+", counter = "+counter);
}
else
{
// do nothing with the cell, but add the existing values to the output sheet
Logger.log("DEBUG: Found a space - time to update output");
// push the values onto an clean array
outputval.push(outputrow);
// reset the row array
outputrow = [];
// get the last row of the output sheet
var outputLR =outputsheet.getLastRow();
Logger.log("DEBUG: output last row = "+outputLR);
// defie the output range
var outputrange = outputsheet.getRange((+outputLR+1),1,1,counter);
Logger.log("DEBUG: the output range = "+outputrange.getA1Notation());
// update the values with array
outputrange.setValues(outputval);
// reset the row counter
counter = 0;
//reset the output value array
outputval=[];
}
}
}