如何使用ImportRange编辑导入的Google工作表?

时间:2019-12-11 01:35:15

标签: google-apps-script google-sheets importrange

我使用=QUERY(IMPORTRANGE..)将A,B和C列的数据从工作表1导入到工作表2。我必须在工作表2的D列中记录每个导入的条目。但是,对于添加的任何新注释,D列中的注释(对于先前的注释)将保留在相同的单元格中。例如,公式在A2中,因此新数据将添加到A2,B2和C2中。注释在D2中。导入新的时,前一个移至A3,B3和C3。但是,该注释仍在D2中。

添加新条目时,有什么方法可以使这些笔记自动移至下一行吗?

以下是必须与之导入数据的文件:https://drive.google.com/drive/folders/1wbOfW9PbSfJbTBv_CwXOTiyyN_LBTiFq?usp=sharing

3 个答案:

答案 0 :(得分:0)

如果注释是字符串,请尝试像这样输入D2:

= ARRAYFORMULA(if(row(A2:A)= max(arrayformula(if(ISBLANK(A2:A),0,row(A2:A))))),“您的注释”,“”))< / p>

这会自动将您的注释放在数据的最后一行

答案 1 :(得分:0)

如果我的理解正确,那么您需要完成以下任务:

  • 使用IMPORTRANGE将数据从一个电子表格导入到另一个电子表格。
  • 手动将notes添加到目标电子表格中的列。
  • 将新行导入到目标电子表格并制作以前导入的数据时,注释也应移动。

要实现这一点,您需要跟踪哪个注释属于导入数据的哪一行。两组数据都应以某种方式附加。考虑到您在A列中有一个时间戳记,并且该时间戳记可能对于每一行都是唯一的,因此可以将该时间戳记用于附加两者(如果不可能,我建议添加另一列,该列将用于标识每一行毫无疑问,通过某种id)。

在这一点上,我会考虑使用Google Apps Script来满足您的需求。使用此工具,您可以开发=QUERY(IMPORTRANGE(...))现在提供的功能,并且可以使用其他Apps脚本工具达到所需的结果。要实现此目的,可能特别需要两种工具:

  • onEdit triggers,以跟踪何时编辑不同的电子表格,并在这种情况下进行适当的更改(基本上是将数据从一个电子表格复制到另一个电子表格)。
  • Properties Service,用于存储有关哪个note附加到哪一行数据的信息。

您可以在以下几行上做一些事情:

  1. 安装两个编辑触发器,(1)一个将在编辑源电子表格时触发功能,(2)另一个将在编辑目标电子表格时触发功能(无法使用简单的触发器,因为您必须引用电子表格可能未绑定到的文件)。您可以执行manuallyprogrammatically

  2. 创建一个函数,该函数针对添加到目标表的每个note(在此代码示例中,该列在D列中,请根据您的偏好进行更改),以存储键值对其中key是A列中的值(应唯一标识一行数据),而valuenote。稍后,脚本将使用它来了解每个note所属的位置:

function storeNotes(e) {
  var scriptProperties = PropertiesService.getScriptProperties();
  var cell = e.range;
  var sheet = cell.getSheet();
  var rowIndex = cell.getRow();
  var column = cell.getColumn();
  var noteColumn = 4; // The column where notes are written, change accordingly
  // Check whether correct sheet, column and row is edited:
  if (column == noteColumn && rowIndex > 1 && sheet.getName() == "Destination") {
    var row = sheet.getRange(rowIndex, 1, 1, sheet.getLastColumn()).getValues()[0];
    scriptProperties.setProperty(row[0], row[noteColumn - 1]); // Store property to script properties
  }
}
  1. 创建一个函数,该函数在每次编辑源电子表格时都将删除目标电子表格中的所有内容,并从源中复制数据。然后,它将查看存储的脚本属性,并使用此信息将注释写入适当的行(因为我看到您只想复制/粘贴某些列,因此在此示例中,某些列-索引位于columnsToDelete中的索引-不会被复制/粘贴,您可以根据自己的喜好轻松更改此设置):
function copyData(e) {
  var range = e.range;
  var origin = range.getSheet();
  var row = range.getRow();
  if (origin.getName() == "Origin" && row > 1) { // Check if edited sheet is called "Origin" and edited row is not a header.
    var dest = SpreadsheetApp.openById("your-destination-spreadsheet-id").getSheetByName("Destination");
    var firstRow = 2;
    var firstCol = 1;
    var numRows = origin.getLastRow() - 1;
    var numCols = origin.getLastColumn();
    var values = origin.getRange(firstRow, firstCol, numRows, numCols).getValues();
    // Removing some of the columns to get copied/pasted (in this case B and D):
    var columnsToDelete = [1, 3];
    values = values.map(function(row) {
      for (var i = row.length; i > 0; i--) {
        for (var j = 0; j < columnsToDelete.length; j++) {
          if (i == columnsToDelete[j]) {
            row.splice(i, 1);
          }
        }
      }
      return row;
    })
    // Copying content from source to destination:
    var firstRowDest = 2;
    var firstColDest = 1;
    var numRowsDest = values.length;
    var numColsDest = values[0].length;
    var noteColumn = 4;
    var currentValues = dest.getDataRange().getValues();
    if (currentValues.length > 1) dest.deleteRows(2, dest.getLastRow() - 1);
    var importedRange = dest.getRange(firstRowDest, firstColDest, numRowsDest, numColsDest);
    importedRange.setValues(values);
    // Writing notes stored in Properties in the appropriate rows:
    var properties = PropertiesService.getScriptProperties().getProperties();
    for (var i = 0; i < values.length; i++) {
      for (var key in properties) {
        if (key == values[i][0]) {
          dest.getRange(i + 2, noteColumn).setValue(properties[key])
        }
      }
    }
  }
}

注意:

  • 如果您希望所有两个函数都使用“属性”,则所有这些函数都应位于同一脚本中。
  • 在此示例中,包含源数据的工作表称为Origin,将其复制到其中的工作表称为Destination(据我了解,它们位于不同的电子表格中)。
  • 在此简化示例中,源工作表的A,B,E列被复制到目标工作表的A,B,C列,并且注释被添加到D列。请通过修改相应的内容来适应您的情况索引。

我希望这会有所帮助。

答案 2 :(得分:0)

感谢大家对我的帮助,尤其是Lamblichus和user11982798。我最近注意到,importrange将以与源文件相同的顺序将数据导入到目标。在我基于时间戳对数据进行降序排序之前,新条目始终位于第一行。如果将其更改为升序,则新行将添加到最后一行,因此音符/注释顺序不会受到影响。

是否可以将目标文件中的注释/评论更新回源文件?