Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何使用ImportRange编辑导入的Google工作表?_Google Apps Script_Google Sheets_Importrange - Fatal编程技术网

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

Google apps script 如何使用ImportRange编辑导入的Google工作表?,google-apps-script,google-sheets,importrange,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中 有没有办法让这些笔记在添加新条目时自动移动到下一行 以下是数据必须导入和导出的文件:如果注释是字符串,请尝试按如下方式放入D2: =数组公式(如果(第(A2:

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

有没有办法让这些笔记在添加新条目时自动移动到下一行


以下是数据必须导入和导出的文件:

如果注释是字符串,请尝试按如下方式放入D2:

=数组公式(如果(第(A2:A)行)=max(数组公式(如果(是空白的,第(A2:A)行),0,第(A2:A)行)),“您的注释”,和“”)


这将自动将您的备忘放在最后一行数据中

如果我的理解正确,您希望完成以下操作:

  • 使用
    IMPORTRANGE
    将数据从一个电子表格导入到另一个电子表格
  • 手动将注释添加到目标电子表格中的列中
  • 将新行导入到目标电子表格并生成以前导入的数据时,注释也应移动
要实现这一点,您需要跟踪哪个注释属于哪一行导入的数据。这两组数据都应该以某种方式附加。考虑到a列中有一个时间戳,并且该时间戳对于每一行可能都是唯一的,该时间戳可以用于附加这两个行(如果不可能,我建议添加另一列,该列将用于通过某种
id
)来识别每一行,而不会产生歧义

在这一点上,我会考虑使用来满足你的需要。使用此工具,您可以开发
=QUERY(IMPORTRANGE(…)
目前提供的功能,并且可以使用其他应用程序脚本工具来实现所需的结果。要实现这一点,可能需要两种工具:

  • ,以跟踪不同电子表格的编辑时间,并在这种情况下进行适当的更改(基本上,将数据从一个电子表格复制到另一个电子表格)
  • ,以存储有关哪个
    注意
    附加到哪个数据行的信息
您可以通过以下几行操作:

  • 安装两个编辑触发器,(1)一个在编辑源电子表格时触发函数,(2)另一个在编辑目标电子表格时触发函数(不能使用简单触发器,因为您必须引用电子表格可能未绑定的文件)。你可以这样做,也可以这样做

  • 创建一个函数,对于添加到目标工作表中的每个
    注释
    (在此代码示例中,在D列中,请根据您的偏好进行更改),该函数存储一个键值对,其中
    是a列中的值(应唯一标识一行数据)而
    注释
    。这将在稍后用于脚本,以了解每个
    注释所属的位置:

  • 创建一个函数,每次编辑源电子表格时,该函数将删除目标电子表格中的所有内容,并从源中复制数据。然后,它将查看存储的脚本属性,并使用这些信息将注释写入相应的行(因为我看到您只想复制/粘贴一些列,所以在本示例中,一些列(其索引位于
    columnsToDelete
    )没有被复制/粘贴,您可以根据自己的首选项轻松地进行更改):
  • 函数copyData(e){
    var范围=e范围;
    var origin=range.getSheet();
    var row=range.getRow();
    如果(origin.getName()==“origin”&&row>1){//检查编辑的工作表是否称为“origin”,并且编辑的行是否不是标题。
    var dest=SpreadsheetApp.openById(“您的目的地电子表格id”).getSheetByName(“目的地”);
    var firstRow=2;
    var-firstCol=1;
    var numRows=origin.getLastRow()-1;
    var numCols=origin.getLastColumn();
    var values=origin.getRange(firstRow、firstCol、numRows、numCols).getValues();
    //删除要复制/粘贴的某些列(在本例中为B和D):
    var columnsToDelete=[1,3];
    values=values.map(函数(行){
    对于(var i=行长度;i>0;i--){
    对于(var j=0;j1)dest.deleteRows(2,dest.getLastRow()-1);
    var importedRange=dest.getRange(firstRowDest、firstColDest、numrowdest、numColsDest);
    导入范围。设置值(值);
    //将存储在属性中的注释写入相应行:
    var properties=PropertiesService.getScriptProperties().getProperties();
    对于(变量i=0;i
    注:

    • 如果希望所有这两个函数都使用属性,那么所有这些函数都应该在同一个脚本中
    • 在本示例中,包含源数据的工作表称为
      原始数据
      ,复制该数据的工作表称为
      目标数据
      (据我所知,它们位于不同的电子表格中)
    • 在这个简化的示例中,源工作表中的A、B、E列被复制到th的A、B、C列
      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
        }
      }
      
      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])
              }
            }
          }
        }
      }