我一直在寻找这个问题的答案,并且根本没有任何运气。我需要做的是使用应用程序脚本将给定行中的所有单元格(即使是空白的单元格)复制到不同工作表上的列。为了能够对一列进行一系列行也会很棒,但我会满足于任何解决方案。如果不可能,那也很高兴知道。
我目前正在使用公式,但由于我正在尝试处理的数据量,我在单个电子表格中对公式施加了限制。
由于
我从帖子中提取了这个数组示例,但我不知道如何将它应用到我的情况中?
function transposeArray(array){
var result = [];
for(var row = 0; row < array.length; row++){ // Loop over rows
for(var col = 0; col < array[row].length; col++){ // Loop over columns
result[row][col] = array[col][row]; // Rotate
}
}
return result;
}
编辑:
我最终只是使用下面的代码来完成我的目标。它逐行排列并转置它们,然后将值设置在前一个条目下面的同一列(第二页上的B2)中。
function transpose(a)
{
return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}
function betaUpdate(fromRange,toAnchor) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source = ss.getSheets()[0];
var destination = ss.getSheets()[1];
//////////////////////////////////////////////////////////////////// July 1
//Row 1
var fromRange = source.getRange("B5:AD5");
var toAnchor = destination.getRange("B2");
var data = fromRange.getValues();
var flip = transpose(data);
var toRange = toAnchor.offset(0, 0, flip.length, flip[0].length);
toRange.setValues(flip);
//Row2
var fromRange1 = source.getRange("B6:AD6");
var toAnchor1 = destination.getRange("B2");
var data1 = fromRange1.getValues();
var flip1 = transpose(data1);
///Offset must be set to the length of previous row
var toRange1 = toAnchor1.offset(28, 0, flip1.length, flip1[0].length);
toRange1.setValues(flip1);
//Row3
var fromRange2 = source.getRange("B7:AD7");
var toAnchor2 = destination.getRange("B2");
var data2 = fromRange2.getValues();
var flip2 = transpose(data2);
///Offset must be set to the length of previous row
var toRange2 = toAnchor2.offset(56, 0, flip2.length, flip2[0].length);
toRange2.setValues(flip2);
};
答案 0 :(得分:2)
我们正在寻找一种可以让我们做这样的事情的功能:
function test_flipFlopAndFly() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheets()[0];
var sheet2 = ss.getSheets()[1];
var fromRange = sheet1.getDataRange(); // Everything on sheet 1
var toAnchor = sheet2.getRange("A1"); // Top Left corner of sheet 2
flipFlopAndFly(fromRange,toAnchor); // <<<<<<< Make that work!
}
根据Serge的建议,这是flipFlopAndFly()
实用程序的简单版本,没有错误检查。你可以看到它并不多。顺便说一句,我正在使用this answer中的transpose()
函数。
/**
* Transpose and copy data in fromRange to another range
* whose top-left corner is at toAnchor.
*
* @param {Range} fromRange Range containing source data
* @param {Range} toAnchor Top Left corner of Range to
* receive transposed data
*/
function flipFlopAndFly(fromRange,toAnchor) {
var data = fromRange.getValues();
var flip = transpose(data);
var toRange = toAnchor.offset(0, 0, flip.length, flip[0].length);
toRange.setValues(flip);
}
进行错误检查:
/**
* Transpose and copy data in fromRange to another range
* whose top-left corner is at toAnchor.
*
* @param {Range} fromRange Range containing source data
* @param {Range} toAnchor Start of Range to receive transposed data
*/
function flipFlopAndFly(fromRange,toAnchor) {
if (arguments.length !== 2) throw new Error ("missing paramater(s)");
try {
// Test that arguments are both Ranges.
fromRange.getDataTable();
toAnchor.getDataTable();
}
catch (e) {
throw new Error ("parameters must be type Range");
}
var data = fromRange.getValues();
var flip = transpose(data);
var toRange = toAnchor.offset(0, 0, flip.length, flip[0].length);
toRange.setValues(flip);
}
没有必要撕开效用函数来完成你想要做的事情,你只需要为转置数据提供适当的锚点。
我鼓励您找到使用固定范围的方法,如果可以的话 - 它会使您的脚本更适应您工作表中的更改。
function betaUpdate(fromRange,toAnchor) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source = ss.getSheets()[0];
var destination = ss.getSheets()[1];
//Row 1
flipFlopAndFly(source.getRange("B5:AD5"),
destination.getRange("B2"));
//Row2
flipFlopAndFly(source.getRange("B6:AD6"),
destination.getRange("B2").offset(28, 0));
//Row3
flipFlopAndFly(source.getRange("B7:AD7"),
destination.getRange("B2").offset(56, 0));
};