当另一个 sheet 更改时更新整个 sheet(脚本)

Update whole sheet when another sheet changes (script)

我有一个 Google Spreadsheet,其中包含主要 sheet(称为 "ABSTRACTS")上的论文名称。其中一列表示该论文是否已在实验室中讨论过 ("si","no")。当列显示 "si"(是)时,脚本将论文名称和信息复制到另一个名为 "Seminarios"(研讨会)的 sheet,如果列显示 "no",它会复制信息另一个sheet叫"DISCUTIR"(讨论)。该脚本工作正常(它将信息复制到适当的 sheet)但它有一个小问题。当我们讨论一篇论文时,我将其状态从 "no" 更改为 "yes",它会将其添加到 SEMINARIO sheet,但不会将其从 "DISCUTIR" 中删除。有没有办法让脚本刷新整个sheet? (如果我删除 "DISCUTIR" sheet 的全部内容,它只会添加我想要的内容,但我想找到一种自动执行此操作的方法)。

这里附上我正在使用的代码。我敢肯定它确实不整洁且效率低下,因为我不知道自己在做什么,所以我为此深表歉意。我有一些 MATLAB 编程经验,但从未使用过 JavaScript,只是设法通过复制和粘贴代码使其工作。

function onEdit(e) {
  var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ABSTRACTS");
  var sheetTo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SEMINARIOS");
  var sheetTo2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DESCARTADOS");
  var sheetTo3 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DISCUTIR");
  var sheetTo4 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("CHEQUEAR");

  var data = sheetFrom.getDataRange().getValues();
  var target = new Array(); // this is a new array to collect data
  for (n = 0; n < data.length; ++n) { // iterate in the array, row by row
    if (data[n][8] == "si") { // if condition is true copy the whole row to target
      target.push(data[n]); // copy the whole row
    } //if
  } //for

  //Paste to another sheet from first cell onwards
  sheetTo.getRange(2, 1, target.length, target[0].length).setValues(target);

  var data = sheetFrom.getDataRange().getValues();
  var target = new Array(); // this is a new array to collect data
  for (n = 0; n < data.length; ++n) { // iterate in the array, row by row
    if (data[n][8] == "descartado") { // if condition is true copy the whole row to target
      target.push(data[n]); // copy the whole row
    } //if
  } //for

  //Paste to another sheet from first cell onwards
  sheetTo2.getRange(2, 1, target.length, target[0].length).setValues(target);

  var data = sheetFrom.getDataRange().getValues();
  var target = new Array(); // this is a new array to collect data
  for (n = 0; n < data.length; ++n) { // iterate in the array, row by row
    if (data[n][8] == "no") { // if condition is true copy the whole row to target
      target.push(data[n]); // copy the whole row
    } //if
  } //for

  //Paste to another sheet from first cell onwards
  sheetTo3.getRange(2, 1, target.length, target[0].length).setValues(target);

  var data = sheetFrom.getDataRange().getValues();
  var target = new Array(); // this is a new array to collect data
  for (n = 0; n < data.length; ++n) { // iterate in the array, row by row
    if (data[n][8] == "chequear") { // if condition is true copy the whole row to target
      target.push(data[n]); // copy the whole row
    } //if
  } //for

  //Paste to another sheet from first cell onwards
  sheetTo4.getRange(2, 1, target.length, target[0].length).setValues(target);

}

我想你明白为什么该行没有消失,但这是因为你只覆盖了新输入数据的最后一行的数据,而没有对之后的行做任何事情。

文档显示有一个名为 clear() 的函数可以删除之前存在的所有内容:https://developers.google.com/apps-script/reference/spreadsheet/sheet#clear

调用sheetTo4.clear()会清除所有内容和格式,而调用sheetTo4.clear({contentsOnly: true})只会清除内容。您当然必须为 sheet.

重写 headers