Как скопировать строку из одной электронной таблицы google в другую электронную таблицу google с помощью google apps script?
Привет
Я хотел скопировать определенную строку из одной таблицы в другую таблицу с помощью google apps script. Кто-нибудь, пожалуйста, помогите мне получить ответ для этого.
Ответы
Ответ 1
Посмотрите здесь документацию:
http://code.google.com/googleapps/appsscript/service_spreadsheet.html
Предположим, что вы работаете в электронной таблице, где вы копируете.
Вам нужно будет обработать текущую таблицу и целевую таблицу. Вам нужно будет получить идентификатор для целевой таблицы. Детали находятся в ссылке там.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.openById("abc1234567");
Далее нам нужно выбрать конкретные листы в этих электронных таблицах. Скажем, ваша строка находится на листе с именем "New Stuff", и у вас есть лист в целевой таблице с именем "Архив".
var source_sheet = ss.getSheetByName("New Stuff");
var target_sheet = target.getSheetByName("Archive");
Теперь концепция, которую используют электронные таблицы Google Apps, - это диапазоны. Диапазон - всего лишь кусок клеток. Поэтому нам нужно определить диапазон дальности и дальности. Скажем, ваш лист имеет 7 столбцов и вам нужна 10-я строка.
var source_range = source_sheet.getRange("A10:G10");
var target_range = target_sheet.getRange("A1:G1");
Итак, мы собираемся взять эту строку и поместить ее в первую строку целевого листа. Теперь для фактической копии:
source_range.copyTo(target_range);
И все готово!
Теперь это всегда будет сжимать первую строку целевого листа. Там вы можете сделать это, чтобы остановить это. Вместо того, чтобы всегда использовать первую строку, вы можете использовать методы объекта листа, чтобы найти последнюю строку, добавить один за ней, а затем использовать ее как свой диапазон.
var last_row = target_sheet.getLastRow();
target_sheet.insertRowAfter(last_row);
var target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));
Таким образом, каждый раз, когда вы копируете строку, она просто добавляется в нижнюю часть листа.
Ответ 2
метод copyTo плохо документирован, потому что он не позволяет копировать содержимое с одного листа на лист в другой таблице. Вы захотите использовать getvalues ans setvalues, как показано ниже:
function CopyDataToNewFile() {
var sss = SpreadsheetApp.openById('0AjN7uZG....'); // sss = source spreadsheet
var ss = sss.getSheetByName('Monthly'); // ss = source sheet
//Get full range of data
var SRange = ss.getDataRange();
//get A1 notation identifying the range
var A1Range = SRange.getA1Notation();
//get the data values in range
var SData = SRange.getValues();
var tss = SpreadsheetApp.openById('8AjN7u....'); // tss = target spreadsheet
var ts = tss.getSheetByName('RAWData'); // ts = target sheet
//set the target range to the values of the source data
ts.getRange(A1Range).setValues(SData);
}
Ответ 3
Я тоже столкнулся с этим. Мне удалось найти хорошее обходное решение, которое копирует все с одного листа на другой (за исключением изображений, графиков, скриптов и т.д.). Он точно копирует формулы, значения, формирует.
В основном решение заключается в
- скопировать исходный лист в целевую таблицу в качестве источника источника temp
- скопировать данные из источника источника temp в целевой лист
- удалить источник источника temp
код:
var sss = SpreadsheetApp.openById(spreadsheet); // sss = source spreadsheet
var ss = sss.getSheetByName(sheet); // ss = source sheet
var ss_temp = ss.copyTo(targetsheet);
var tss = SpreadsheetApp.openById(spreadsheet); // tss = target spreadsheet
var ts = tss.getSheetByName(sheet); // ts = target sheet
var range2Copy = ss_temp.getRange(range);
range2Copy.copyTo(ts.getRange(range));
bss.setActiveSheet(ss_temp);
bss.deleteActiveSheet()
Основываясь на приведенном выше, я создал электронную таблицу, которая позволяет мне обновлять многие копии из главной электронной таблицы. Имея около 15 копий, он сохраняет много действий по копированию.
Ответ 4
Возможно, этот пост поможет вам http://l.rw.rw/gscripts3. Он описывает функциональность функции копирования с различными условиями (ограничивать данные по диапазону, настраиваемые фильтры, размещать данные для целей с помощью методов вставки или замены). И есть рабочий пример, где вы можете попробовать.
Ответ 5
Другой способ сделать это - импортировать строку (или любой диапазон) из источника в целевую таблицу.
Предполагая, что вы хотите импортировать строку 3 из листа электронных таблиц источника, называемого "source-spreadsheet-sheet-name", поместите в первый столбец целевого местоположения следующую формулу:
=IMPORTRANGE("source-spreadsheet-key","source-spreadsheet-sheet-name!3:3")
где "source-spreadsheet-key"
- это идентификатор исходной таблицы, который вы извлекаете из его URL-адреса.
Если вы сделаете это в первый раз, появится сообщение безопасности:
![enter image description here]()
Просто подтвердите, и вся строка будет заполнена автоматически.
Помните, что иногда для обновления импортированных ячеек требуется несколько минут после внесения изменений в исходную область. Однако вы можете ускорить его, нажав ctrl-E или ctrl-shift-E, находясь в целевой таблице, в зависимости от того, что работает.
Ответ 6
Это не работает - возвращает ошибку "Целевой диапазон и диапазон источников должны находиться на одной и той же электронной таблице". Похоже, нам нужно сделать что-то похожее на это:
function copyRow_ (origSheetName, destSheetName, origRowNumber, destRowNumber)
{
var origSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(origSheetName);
var destSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(destSheetName);
var origLastCol = origSheetObject.getLastColumn();
var arrOrigData = origSheetObject.getRange(origRowNumber, 1, 1, origLastCol).getValues();
var destlastRow = destSheetObject.getLastRow() + 1;
if (destRowNumber)
destlastRow = destRowNumber;
var cont;
for (cont = 0; cont < origLastCol; cont++)
destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);
}
(явно украден из здесь)
Ответ 7
Используйте range.setValues, это лучший выбор.
Работает для любого диапазона на любом листе, поскольку диапазон начала и назначения аналогичен.
Вот пример кода:
function openCSV() {
//Buscamos el archivo
var files = DriveApp.getFilesByName("ts.csv");
//Cada nombre de archivo es unico, por eso next() lo devuelve.
var file = files.next();
fileID = file.getId();
//Abrimos la spreadsheet, seleccionamos la hoja
var spreadsheet = SpreadsheetApp.openById(fileID);
var sheet = spreadsheet.getSheets()[0];
//Seleccionamos el rango
var range = sheet.getRange("A1:F1");
values = range.getValues();
//Guardamos un log del rango
//Logger.log(values);
//Seleccionamos la hoja de destino, que es la activeSheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var SSsheet = ss.getSheets()[0];
//Seleccionamos el mismo rango y le asignamos los valores
var ssRange = SSsheet.getRange("A1:F1");
ssRange.setValues(values);
}