1

我有一个 Google Apps 脚本,我想用它来执行此操作:获取工作表 G 列的所有单元格的文本,从该文本中提取一些数据(文本中嵌入的日期)并将结果放在 H 列中。可以从原始文本中提取日期。但我无法迭代并将其放入邻居列(“H”),因为当我使用此代码尝试此操作时,没有任何反应。我得到了这个日志:

在此处输入图像描述

这是我的代码:

function changeNextCell() {
  var range = SpreadsheetApp.getActiveSheet().getActiveRange();
  var numRows = range.getNumRows();
  for (var i = 2; i <= numRows; i++) {
      var rawText = range.getCell(i,6).getValue();
      var newDate = findDate(rawText);
      range.getCell(i,6).setValue(newDate);
    }  
}


function findDate (text){
  text1 = text.split("Date:");
date = 'no date informed';
for (var i=0; i<text1.length; i++) {
     text2 = text1[i].split(" ");
     if (text2[1] === 'open:'){
         date = text2[2];
     }
  }
  return date;
}

有人可以告诉我如何解决它应该做的工作吗?(替换下一列中的所有值)提前感谢您的帮助!

4

1 回答 1

0

您说您想获取 G 列上的所有值,但在代码上您执行getActiveRange. 好吧,该功能仅返回您屏幕上选择的内容。如果您在运行之前没有手动选择整个 G 列,它确实不会执行任何操作。这与你所说的一致。

好吧,要么就是这样,要么你正在混合什么Range.getCell。我不确定误解在哪里。希望提供的代码可以帮助您理解。

最后,逐个单元格地获取和设置值不是一个好方法,主要是因为它要慢得多。你应该一次得到它,循环,然后设置它。这是我的做法:

function setColumnHfromG() {
  var s = SpreadsheetApp.getActiveSheet();
  var input = s.getRange(2, 7, s.getLastRow()-1, 1).getValues();
  //I'm skipping the first row here as this seemed to be your intention
  //Also, I'm considering the column (G) is fully filled. i.e. I'm not checking for empty cells
  var output = [];
  for (var i = 0; i < input.length; i++)
    output.push([ findDate(input[i][0]) ]);

  s.getRange(2, 8, output.length, 1).setValues(output);
}

如果您想“检测”哪一列是选定范围,但不强制用户选择整列。你可以这样做:

function setNextColumn() {
  var s = SpreadsheetApp.getActiveSheet();
  var column = s.getActiveRange().getColumn();
  var input = s.getRange(2, column, s.getLastRow()-1, 1).getValues();
  var output = [];
  for (var i = 0; i < input.length; i++)
    output.push([ findDate(input[i][0]) ]);

  s.getRange(2, column+1, output.length, 1).setValues(output);
}

ps:我相信你findDate的功能是正确的,但如果不是至少在你得到脚本做某事之后修复它会更容易。

于 2013-10-31T00:54:59.007 回答