Как отредактировать импортированный лист Google с помощью ImportRange?

Я использовал =QUERY(IMPORTRANGE..) для импорта данных с листа 1 на лист 2 для столбцов A, B и C. Я должен отметить столбец D листа 2 для каждой импортированной записи. Однако для любого нового добавленного примечания (для предыдущих) в столбце D остается в тех же ячейках. Например, формула находится в A2, поэтому новые данные будут добавлены в A2, B2 и C2. Заметка находится в D2. Когда импортируется новый, предыдущий перемещается в A3, B3 и C3. Однако записка все еще находится в D2.

Есть ли способ сделать так, чтобы эти заметки автоматически переходили к следующей строке при добавлении новой записи?

Вот файлы, в которые необходимо импортировать данные: https://drive.google.com/drive/folders/1wbOfW9PbSfJbTBv_CwXOTiyyN_LBTiFq?usp=sharing


person nick    schedule 11.12.2019    source источник
comment
Можете ли вы уточнить, о каких заметках вы говорите?   -  person player0    schedule 11.12.2019
comment
Прочтите Как сохранить «сопряжение» ячеек с результатами запроса. Это именно то, что вам нужно сделать, и ответ будет от очень опытных пользователей.   -  person Tedinoz    schedule 11.12.2019
comment
Я перешел по ссылке, но пока не нашел подходящего решения. Мое временное решение - создать столбец для комментария в листе ввода, чтобы он был импортирован в другой.   -  person nick    schedule 11.12.2019
comment
Я думаю, что столбец D не будет затронут запросом, кроме случаев, когда столбец D является формулой, которая использует любую ячейку из столбца A, B или C. Как сказал player0, о каких заметках вы говорили, просто ячейка строки или заметки? Если это была строка, вы можете объединить диапазон импорта запроса со своей строкой, так что строка te будет следовать до вашей последней строки данных.   -  person user11982798    schedule 11.12.2019
comment
Где и как добавляются примечания в столбце D? Не могли бы вы использовать скрипт Google Apps для достижения своей цели?   -  person Iamblichus    schedule 11.12.2019
comment
Примечание представляет собой строку и добавляется вручную всякий раз, когда была импортирована новая запись. Я подумываю использовать сценарий, но не знаю, как это сделать, так как у меня это плохо получается. Я изучил много вещей на этом сайте, но могу делать только простые. В моем случае у меня есть основной лист для добавления данных, и если данные соответствуют определенному условию, они будут сгруппированы в отдельные листы, где я могу добавить комментарии / примечания для каждого из них. И, если возможно, вернитесь к основному листу.   -  person nick    schedule 12.12.2019
comment
Похоже, что это легко сделать с помощью скрипта приложений, но, боюсь, у меня недостаточно информации о том, чего вы хотите достичь. Пожалуйста, рассмотрите возможность предоставления электронной таблицы, над которой вы работаете, а также объяснения желаемого результата, чтобы сообщество могло вам помочь.   -  person Iamblichus    schedule 12.12.2019
comment
Пожалуйста, перейдите по ссылке ниже, чтобы получить доступ к файлам. drive.google.com/drive/folders/. Оставил комментарий к файлу обучения. Надеюсь, кто-нибудь сможет мне помочь.   -  person nick    schedule 16.12.2019


Ответы (3)


Если я правильно понимаю, вы хотите выполнить следующее:

  • Импортируйте данные из одной таблицы в другую, используя IMPORTRANGE.
  • Добавьте notes вручную в столбец целевой электронной таблицы.
  • Когда новая строка импортируется в целевую электронную таблицу и вносятся ранее импортированные данные, заметки также должны перемещаться.

Для этого вам нужно будет отслеживать, какая заметка принадлежит какой строке импортированных данных. Оба набора данных должны быть как-то прикреплены. Учитывая, что у вас есть отметка времени в столбце A, и эта отметка времени, вероятно, уникальна для каждой строки, эту отметку времени можно использовать для присоединения обеих (если это невозможно, я бы предложил добавить еще один столбец, который будет использоваться для идентификации каждой строки без двусмысленности, через какой-то id).

На этом этапе я бы подумал об использовании скрипта Google Apps для удовлетворения ваших потребностей. С помощью этого инструмента вы можете развить функциональность, которую =QUERY(IMPORTRANGE(...)) предоставляет прямо сейчас, и вы можете использовать другие инструменты Apps Script для достижения желаемого результата. Для этого могут потребоваться два инструмента:

  • триггеры onEdit, чтобы отслеживать, когда редактируются различные таблицы и внесите соответствующие изменения, если это так (в основном, копируя данные из одной электронной таблицы в другую).
  • Служба свойств, для хранения информации, к которой прикреплен note к какой строке данных.

Вы можете сделать что-нибудь в следующих строках:

  1. Установите два триггера редактирования: (1) один, который будет запускать функцию при редактировании исходной электронной таблицы, и (2) другой, который будет срабатывать при редактировании целевой электронной таблицы (простой триггер не может использоваться, потому что вам нужно ссылаться на файлы, чтобы который ваша электронная таблица может не быть связана). Вы можете сделать это вручную или программно.

  2. Создайте функцию, которая для каждого note, добавляемого в целевой лист (в этом примере кода, это в столбце D, пожалуйста, измените в соответствии с вашими предпочтениями), хранит пару ключ-значение, где key - значение в столбце A ( который должен однозначно идентифицировать строку данных), а value - это note. Это будет использоваться позже, чтобы сценарий знал, где каждый 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. Измените это в соответствии с вашим случаем, изменив соответствующие индексы.

Я надеюсь, что это поможет.

person Iamblichus    schedule 17.12.2019

Если примечание представляет собой строку, попробуйте ввести D2 следующим образом:

= ARRAYFORMULA (if (row (A2: A) = max (arrayformula (if (ISBLANK (A2: A), 0, row (A2: A)))), "Your Note", ""))

Это автоматически поместит вашу заметку в последнюю строку данных.

person user11982798    schedule 11.12.2019

Спасибо всем за помощь, особенно Lamblichus и user11982798. Недавно я заметил, что importrange будет импортировать данные в место назначения в том же порядке, что и исходный файл. Раньше я отсортировал данные по метке времени в порядке убывания, чтобы новая запись всегда находилась в первой строке. Если я изменил его на возрастающий порядок, новый будет добавлен в последнюю строку, поэтому порядок заметок / комментариев не изменится.

Можно ли обновить заметку / комментарий в целевом файле до исходного?

person nick    schedule 19.12.2019
comment
Разве =IMPORTRANGE("your-destination-spreadsheet-url", "O4:O") не добьется того, чего вы хотите достичь? В любом случае это совсем другой вопрос. Если у вас есть проблемы с этим, я дам ответ на этот вопрос, объясняя, что вы сделали для решения этой проблемы, и отправлю еще один вопрос для решения вашей новой проблемы. - person Iamblichus; 19.12.2019