【问题标题】:Google sheets move row depending on value AND edit values谷歌表格根据值移动行并编辑值
【发布时间】:2019-05-18 16:10:27
【问题描述】:

我在 Stack 上阅读了很多年的答案,终于决定加入!所以这是我的第一个问题:

我在这里找到了一个用于 google 表格的 google 应用脚本,该脚本根据单元格值将一行移动到另一个表格。这很棒。我已经对其进行了测试,它对我进行了一些更改 - 首先使用复选框,然后使用复选框复制除第一列之外的所有列。

但是,为了对我真正有用,我希望能够在将行添加到新工作表之前编辑几个值。

所以应该是这样的:

  1. 如果 Checkbox = true,则复制行,除复选框外的所有列
  2. 将“位置”的值设置为“伦敦”(例如第 8 列)
  3. 将“日期”的值设置为今天(例如第 12 列)
  4. 将已编辑的行添加到底部的新工作表中

谁能帮我实现这个目标?我猜它一定很简单,但我是应用程序脚本的新手,所以不知道该怎么做。

这是我从 2011 年的帖子中找到的移动行的基本脚本:

function onEdit(event) {
  // assumes source data in sheet named Needed
  // target sheet of move to named Acquired
  // test column with checkbox is col 1 or A
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Needed" && r.getColumn() == 1 && r.getValue() == true) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Acquired");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 2, 1, numColumns).copyTo(target);
  }
}

希望有人可以提供帮助。提前致谢!

【问题讨论】:

  • 如果我理解正确,您希望在将值添加到 Acquired 后修改 Needed 中的值。您想如何确定位置值,或者该值是否始终为“伦敦”?开始回答您的问题的好地方是官方文档:developers.google.com/apps-script/reference/spreadsheet
  • 嗨,c0de。是的,或多或少。我想象着在添加到 Acquired 表之前在脚本中更改的值,但我想如果有必要的话,它们也可能在之后发生?对于位置,我认为它将来自第二列中选择的值。日期永远是今天。感谢您的链接。官方文档很全面,但我发现有点难以知道从哪里开始。谢谢。

标签: google-apps-script google-sheets


【解决方案1】:

请试试这个代码:

function onEdit(event) {
  // assumes source data in sheet named Needed
  // target sheet of move to named Acquired
  // test column with checkbox is col 1 or A
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Needed" && r.getColumn() == 1 && r.getValue() == true) {
    var row = r.getRow();
    var numColumns = s.getLastColumn() - 1;
    var data = s.getRange(row, 2, 1, numColumns).getValues();
    data[0][8] = 'London';
    data[0][12] = new Date();
    var targetSheet = ss.getSheetByName("Acquired");
    targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, numColumns).setValues(data);
  }
}

【讨论】:

  • 谢谢!我认为这可行,但我选择了 c0de 的解决方案,因为它更全面。
【解决方案2】:

请试试这个,让我知道你的情况。 :)

function onEdit(event) {
//assumes source data in sheet named Needed
//target sheet of move to named Acquired
//test column with checkbox is col 1 or A
var spreadsheet = event.source;
var sheet = spreadsheet .getActiveSheet();
var range = spreadsheet.getActiveRange();
var sheetName = sheet.getName();
var col = range.getColumn();
var value = range.getValue();

if (sheetName === "Needed" && col === 1 && value === true) {
var row = range.getRow();
var numColumns = sheet.getLastColumn();
var targetSheet = spreadsheet.getSheetByName("Acquired");
var lastRow = targetSheet.getLastRow();
var target = targetSheet.getRange(lastRow + 1, 1, 1, numColumns - 1);
//added number of rows and columns to select a range instead of a single cell
var values = sheet.getRange(row, 2, 1, numColumns - 1).getValues();

values[0][7] = values [0][1];
//access value of row 1, column 8 and set to value of row 1, column 2
//the values are captured in an array and are zero-based. The first column is column 0 for example.

values[0][11] = new Date();
//access value of row 1, column 12 and set to date-time value of 'now'.

target.setValues(values);
}
}

【讨论】:

  • 谢谢 c0de,太好了。它对我来说效果很好。我在工作表的开头有 4 列,其中包含要更新的数据,因此我将其拆分为两个数组。然后第一个数组更新第二个数组。谢谢!
  • 我很高兴它有帮助!请考虑将我的答案标记为正确并投票。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多