Если я правильно понимаю, вы хотите выполнить следующее:
- Импортируйте данные из одной таблицы в другую, используя
IMPORTRANGE
.
- Добавьте
notes
вручную в столбец целевой электронной таблицы.
- Когда новая строка импортируется в целевую электронную таблицу и вносятся ранее импортированные данные, заметки также должны перемещаться.
Для этого вам нужно будет отслеживать, какая заметка принадлежит какой строке импортированных данных. Оба набора данных должны быть как-то прикреплены. Учитывая, что у вас есть отметка времени в столбце A, и эта отметка времени, вероятно, уникальна для каждой строки, эту отметку времени можно использовать для присоединения обеих (если это невозможно, я бы предложил добавить еще один столбец, который будет использоваться для идентификации каждой строки без двусмысленности, через какой-то id
).
На этом этапе я бы подумал об использовании скрипта Google Apps для удовлетворения ваших потребностей. С помощью этого инструмента вы можете развить функциональность, которую =QUERY(IMPORTRANGE(...))
предоставляет прямо сейчас, и вы можете использовать другие инструменты Apps Script для достижения желаемого результата. Для этого могут потребоваться два инструмента:
- триггеры onEdit, чтобы отслеживать, когда редактируются различные таблицы и внесите соответствующие изменения, если это так (в основном, копируя данные из одной электронной таблицы в другую).
- Служба свойств, для хранения информации, к которой прикреплен
note
к какой строке данных.
Вы можете сделать что-нибудь в следующих строках:
Установите два триггера редактирования: (1) один, который будет запускать функцию при редактировании исходной электронной таблицы, и (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
}
}
- Создайте функцию, которая при каждом редактировании исходной электронной таблицы будет удалять все содержимое целевой электронной таблицы и копировать данные из источника. Затем он просмотрит сохраненные свойства скрипта и, используя эту информацию, запишет примечания в соответствующие строки (потому что я вижу, что вы хотите скопировать / вставить только некоторые столбцы, в этом примере некоторые столбцы - те, чей индекс находится в
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