将不相邻的列转换为Google表格中的正确/标题大小写

时间:2017-07-12 05:37:24

标签: google-apps-script google-sheets

我在网上找到了一些东西,它适用于将文字改为标题案例;但是,它只适用于相邻列,我需要将其应用于多个不相邻的列。我将粘贴在脚本中。如果你可以修复一下,让我们能够让脚本在我指定的多个不相邻的列上运行,那就太好了。我在网上发现了一些可以做到这一点的东西,但我不清楚。 这是有效的脚本:

function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange("A_range");
range.activate();
var values = range.getValues();
if (values.map) {
range.setValues(values.map(function(row) {
return row.map(titleCase);
}));
}    
else {
range.setValue(titleCase(values));
}
}

function titleCase(str) {
return str.toString().split(/\b/).map(function(word) {
return word ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() :      '';
}).join('');
}

这是来自其他人的这个概念: 让它在其他列上运行的东西是:

var range1=sheet.getRange("A1:A19").getValues();
var range2=sheet.getRange("C1:C19").getValues();
var range=[],i=-1;
while ( range1[++i] ) { 
range.push( [ range1[i][0], range2[i][0] ] );
}

其中范围将包含两列的内容。

data = sheet.getRange("A1:C19").getValues();
for (i = 0; i < data[0].length; i++) {
// do something with data[0][i]  
// do something with data[2][i]
}

我不确定如何实施上面列出的其他2个其他想法。如果你可能真的具体,比如实际上把东西放到允许它在Col.A和Col.D上运行的第一个脚本中,那么它会比一般性好得多,因为我真的很陌生并花了很多钱大量的时间试图学习/掌握它。谢谢!

1 个答案:

答案 0 :(得分:1)

因为尽可能少地对SpreadsheetApp API进行调用对于速度更好,我更喜欢简单地在第一列和最后一列之间获取所有单元格的范围,将转换应用于所选列,然后编写整个回来了。如果列更改,则唯一可以编辑的地方是单个模式数组。

var columnPattern = [1,5,6,7] // Equivalent to [A,E,F,G]

然后,脚本在表示工作表的二维数组上运行一个简单的映射。

function transform() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];

  // Rows (Could be first row and last row, OP isn't clear.
  var startRow = 1, endRow = sheet.getLastRow();

  // An array with Column indexes for those you want in Title Case.
  var columnPattern = [1,5,6,7];
  var firstColumn = parseInt(columnPattern.slice(0,1));
  var lastColumn = parseInt(columnPattern.slice(-1));

  // The whole range
  var range = sheet.getRange(startRow,
                             firstColumn,
                             endRow,
                             lastColumn - firstColumn)

  // Apply Title Case to selected columns.  
  var data = range.getValues().map(function(row, i, rows) {
    row = row.map(function(col, j, row) {
      if(columnPattern.indexOf(j + firstColumn) >= 0) {
        col = titleCase(col);
      }
      return col;
    });
    return row;
  });
  range.setValues(data);
}

我可能澄清的唯一一点是它确定要修改的列的行。

if(columnPattern.indexOf(j + firstColumn) >= 0) {

这只是纠正columnPattern数组与工作表的尺寸不同。另一种方法是使一个与x维度匹配的数组与布尔值相匹配,但这对于更改工作表的大小不太适应。

我不赞成将它放在onEdit()函数中,但这取决于你的用例数据更改的频率。