首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移转细胞同时保持细胞背景

移转细胞同时保持细胞背景
EN

Stack Overflow用户
提问于 2019-09-07 03:16:34
回答 3查看 169关注 0票数 0

我正在创建一个电子表格来跟踪谁每天都做了什么。由于复杂的原因,我不想进入工作表,必须按行而不是列排序。

我的完整脚本工作很好,除了它清除了每个单元格的背景色时,它转置。我可以手动转换和排序,保留细胞背景(某些细胞必须根据来自另一张纸的输入进行颜色编码),但这很乏味,这就是为什么人们首先要编写脚本。

我尝试过以各种方式将下面的代码编辑成getBackgrounds()setBackgrounds()。我的结论是我需要帮助。

代码语言:javascript
复制
function Transpose() {
//This function Transposes it in order to sort since google doesn't let you sort by rows.

  // get all the data in the sheet
  var ss  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet3');
  var range = ss.getDataRange();
  var values = range.getValues();

  // clear existing
  range.clear();

  // transpose it & write it out
  ss.getRange(1,1,values[0].length,values.length)
    .setValues(Object.keys(values[0]).map ( function (columnNumber) {
      return values.map( function (row) {
        return row[columnNumber];
      });
    }));
  }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-07 06:13:43

修改

在以下几个方面的访问背景:

代码语言:javascript
复制
var backgrounds = range.getBackgrounds();

将转置逻辑移到实用程序函数并优化它:

代码语言:javascript
复制
/**
 * Transposes values;
 * @param {Array<Array>} values input Array;
 * @return {Array<Array>} transposed Array;
 */
function transpose(values) {
  return values[0].map(function(col,c){
    return values.map(function(row){
      return row[c];
    });
  });
}

将前面的步骤结合到您的主要功能中,干净和简单:

代码语言:javascript
复制
function Transpose() {

  // get all the data in the sheet
  var ss  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet3');
  var range = ss.getDataRange();

  //access values and backgrounds;
  var values = range.getValues(); 
  var backgrounds = range.getBackgrounds();

  // clear existing;
  range.clear();

  //transpose;
  values = transpose(values);
  backgrounds = transpose(backgrounds);

  //access target range - note that dimensions are inversed;
  var target = ss.getRange(1,1,values.length,values[0].length);

  //set values and backgrounds;
  target.setValues(values);
  target.setBackgrounds(backgrounds);
}
票数 3
EN

Stack Overflow用户

发布于 2019-09-07 08:52:55

您可以只使用内置的转置:

代码语言:javascript
复制
function transpose() {
  var ss  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet3');
  var range = ss.getDataRange();
  range.copyTo(
    ss.getRange('A1'),
    SpreadsheetApp.CopyPasteType.PASTE_NORMAL,
    true
  );
}

如果您想忽略公式,只复制值/格式,

代码语言:javascript
复制
["VALUES","FORMAT"].forEach(function(type){
  range.copyTo(
    ss.getRange('A1'),
    SpreadsheetApp.CopyPasteType["PASTE_" + type ],
    true
  );
})

参考文献:

票数 3
EN

Stack Overflow用户

发布于 2019-09-07 06:03:54

只是也要应用背景

forEach作为一个一致的解决方案

代码语言:javascript
复制
/**
 * Transposes with backgrounds
 */
function transpose() {
  // get all the data in the sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet3');
  var range = ss.getDataRange();
  var values = range.getValues();
  var backgrounds = range.getBackgrounds();
  var transposeBackgrounds = [];
  var transposeValues = [];

  values[0].forEach(function(_, i) {
    var rowValues = [];
    var rowBackgrounds = [];
    values.forEach(function(_, j) {
      rowValues.push(values[j][i]);
      rowBackgrounds.push(backgrounds[j][i]);
    });
    transposeValues.push(rowValues);
    transposeBackgrounds.push(rowBackgrounds);
  });

  // clear existing
  range.clear();

  // transpose it & write it out
  ss.getRange(1, 1, transposeValues.length, transposeValues[0].length)
    .setValues(transposeValues)
    .setBackgrounds(transposeBackgrounds);
}

当前代码的实现

基于此,您可以在代码上实现它。

代码语言:javascript
复制
function Transpose() {
  // This function Transposes it in order to sort since bla-bla-bla

  // get all the data in the sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet3');
  var range = ss.getDataRange();
  var values = range.getValues();
  var backgrounds = range.getBackgrounds();
  var transposeBackgrounds = [];

  // clear existing
  range.clear();

  // transpose it & write it out
  ss.getRange(1, 1, values[0].length, values.length)
    .setValues(
      Object.keys(values[0]).map(function(columnNumber) {
        var rowBackgrounds = [];
        var newRow = values.map(function(row, i) {
          rowBackgrounds.push(backgrounds[i][columnNumber]);
          return row[columnNumber];
        });
        transposeBackgrounds.push(rowBackgrounds);
        return newRow;
      })
    )
    .setBackgrounds(transposeBackgrounds);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57830392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档