在电子表格或电子表格中的特定工作表上运行脚本,并有条件地将数据提取到另一个工作表

时间:2013-10-12 17:48:41

标签: google-sheets

这是我的第二个问题,因为第一个问题是由patt0解决的,谢谢!

我有一个编辑工作脚本,每次编辑工作表时都会检查,如果列的任何单元格的值为no。 7将更改为" RECEBER",它会将整行拉到另一张纸上。起初,我认为这对我有用,但很快就发现onEdit有一些与我想做的事情不兼容的限制。

由于我不能依赖onEdit,我想从我想要的时候创建的菜单(按照patt0的建议)运行脚本。这可以一次完成,整个spredsheet,也可以一页一页(我相信两者的解决方案将是相似的,两种方式对我来说都非常方便)。

这里是我的代码(不工作 - 改编自以前的编辑代码):

第一部分是存储工作表名称以检查它是否在1到31之间;

function mustBeCopied(sheetName) {
  var sheetNumber = parseInt(sheetName);
  if (sheetNumber <=31 && sheetNumber >=1)
    return true;
  return false;
}

这第二部分可能是一些问题,因为它来自onEdit函数。

function RECEBER() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); // stores the active spreadsheet (where the script is being ran)
  var s = ss.getActiveSheet(); // stores the Active sheet within the stored spreadsheet
  var r = ss.getActiveRange(); // stores the range of rows in my document ?
  if(mustBeCopied(s.getName()) && r.getColumn() == 7 && r.getValue() == "RECEBER") { // if mustBeCopied, when applied to the sheet defined in the s variable is satisfied, it will check on every row if the value "RECEBER" is in its 7th column.
    var row = r.getRow(); // stores the row that satisfied the condition
    var numColumns = s.getLastColumn(); // stores the last column on the sheet ?
    var targetSheet = s.getSheetByName("money"); // sets the target sheet
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); // gets range on the target sheet and adds one more row for the new data to be inserted
    s.getRange(row, 1, 1, numColumns).copyTo(target); // writes the data into the target sheet, but I don't understand how..
  }
}

我正在逐步分析,看看我是否了解发生了什么......

我确信这可以很容易地完成,并且我很想学习,但我似乎无法在网上找到解决方案......我认为这已经是一个讨论的主题了。 如果我能自动完成这项工作,那么每个月我都会节省很多时间。它还可以降低人为错误的风险,因为它将由计算机处理..

我希望有人可以帮助我.. 感谢。

1 个答案:

答案 0 :(得分:0)

你有执行记录(View - &gt; Execution transcript)来观察执行堆栈(任何错误都会在那里)。

以下代码可能会有所帮助:

/* CODE FOR DEMONSTRATION PURPOSES */
function onEdit(e) {
  var targetSheet = e.source.getSheetByName('money'), 
      range = e.range,
      s = range.getSheet(),
      lastColumn = s.getLastColumn();
  if (mustBeCopied(s.getName()) && range.getColumn() === 7 && e.value === 'RECEBER')
    s.getRange(range.getRow(), 1, 1, lastColumn).copyTo(targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, lastColumn));
}

根据需要进行调整。