В данной статье я рассмотрю возможность переноса таблицы как набора данных в ячейках из гугл таблицы в гугл документы следующими способами:
1. Перенос таблицы с сохранением связи в google sheets
Например, у меня есть следующая таблица:
И мне надо перенести ее в гугл документы.
Для этого я выделяю диапазон:
и копирую его через комбинацию клавиш Ctrl+V.
Далее, открываю необходимый файл гугл документов и нажимаю Ctrl+V
Гугл документы спросит в каком виде провести копирование:
Выбираю «Связать с таблицей».
В том случае, если таблица будет изменена в Google sheets, будет доступно изменение данных этой же таблицы в Google docs.
Меняю данные в Google sheets:
В Google docs появляется значок связи и возможность обновить данные:
И после нажатия на «ОБНОВИТЬ» в таблице отразятся актуальные данные:
2. Перенос таблицы без сохранения связи в google sheets
Все процедуры по переносу аналогичны описанному способу выше, но в параметрах переноса указывается:
Результат будет аналогичным, но в случае обновления данных в гугл таблицах, таблица и ее данные в гугл документах обновлена не будет.
3. Перенос таблицы при помощи скрипта
Данная необходимость может возникнуть в случае, когда данные гугл таблицы обновляются из интернета и нужна статистика по изменениям, например в еженедельном отчете, который формируется помимо всего прочего как документ.
function transferTableToGDocs() {
// Google sheets part
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getSheetByName('GAS');
const tableRange = ws.getDataRange()
const tableToTransfer = tableRange.getDisplayValues()
// Google docs part
const gdoc = DocumentApp.openById('DOC ID');
const docBody = gdoc.getBody();
const header = docBody.appendParagraph(`Таблица от ${new Date()}`);
header.setHeading(DocumentApp.ParagraphHeading.HEADING3);
docBody.appendTable(tableToTransfer);
}
const tableRange = ws.getDataRange()
— getDisplayValues необходим, чтобы перенести данные так как они отражаются в гугл таблице.
const tableToTransfer = tableRange.getDisplayValues()
const gdoc = DocumentApp.openById('DOC ID')
; — открываю гугл документ по его айди.const docBody = gdoc.getBody();
— получают тело документа.
const header = docBody.appendParagraph(`Таблица от ${new Date()}`);
— добавляю параграф с текстом и датойheader.setHeading(DocumentApp.ParagraphHeading.HEADING3);
— делаю этот параграф Заголовком 3.
docBody.appendTable(tableToTransfer);
— добавляю таблицу.
Важно! — необходимо отличать appendParagraph
и appendTable
, которые добавляют данные в конец docBody
от insertParagraph
и insertTable
, которые вставляют параграф и таблицу по ChildIndex.
После этого скрипт можно завесить на триггер по дате/времени и вставлять таблицы на какой-либо временной основе.
Ваше мнение важно и может улучшить блог
Я хочу услышать ваше мнение и ваши идеи о том, как сделать этот сайт еще лучше. Примите участие в опросе, чтобы поделиться вашими пожеланиями, предложениями и замечаниями. Пройдите опрос сейчас и помогите сделать этот сайт более полезным для вас!
Здравствуйте, у вас таблица с 10 товарами, но бывает так что товаров может быть сегодня 10 а завтра 5 , возможно как сделать так что бы изменялись количество строк исходя из количество товаров, без пустых строк
Добрый день.
const tableRange = ws.getDataRange() — как раз и берет все непустые строки-столбцы, то есть без привязки к количеству строк или столбцов будь их хоть 10, хоть 5, хоть 25.
Если по какой-то причине он захватывает пустые строки (хотя не должен), используйте для выделения того, что надо копировать getRange()
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow,-column,-numrows,-numcolumns
и в нем третьим аргументом — getLastRow()
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getlastrow
Добрый день! Подскажите где можно узнать про ChildIndex в документах гугл(документацию по google app script я нашел). Я так понимаю это метка в гугл документе. А как можно ее поставить в документе?
Добрый день!
Это не совсем метка, воспринимайте элемент как массив. Например тело документа со всеми параграфами, разрывами , новыми строками, переводами строк и тд. Каждый из них — по сути элемент массива body. Получите весь документ как body = ActiveDocument().getBody() — если проводить аналогию то getRange в гуглотаблицах. Получите массив содержащий некие данные. Далее если посмотреть на него через getNumChildren() вы по сути получите длину этого массива — array.length. и вот как раз childIndex — цифра — обращается по индексу к конкретному элементу в вашем массиве. Сделайте привычный цикл for и посмотрите что в каждом элементе. Пример — https://docs.google.com/document/d/1DEIZC2Y9vuY0QMjDSl4fHB0YryERK5Ee9IhMCuWIt_Q/edit?usp=sharing
Можно еще посмотреть вот тут — https://dmitriizhuk.ru/2022/03/29/%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d1%8b-%d0%b2-google-docs-%d1%87%d0%b0%d1%81%d1%82%d1%8c-1-%d1%82%d0%b5%d0%ba%d1%81%d1%82-%d0%bf%d0%b0%d1%80%d0%b0%d0%b3%d1%80%d0%b0%d1%84%d1%8b-%d1%81%d1%82/
там тоже есть про чайлдов
Огромное спасибо за ответ, очень подробно объяснили
Добрый день. Подскажите как перенести таблицу скриптом. Чтобы она отображалась в гугл док. так же как и в 1 и 2 варианте с учётом всех форматов. А не просто таблицей как в 3.?
Добрый день.
Вот тут решение вашей задачи- https://stackoverflow.com/questions/73809126/how-to-copy-google-sheet-table-to-google-doc-with-same-text-color-and-formatting
Чтобы понять более детально что там происходит, можно начать вот с этого https://developers.google.com/codelabs/apps-script-fundamentals-4?hl=ru#5
Спасибо большое за ответ. Очень помогло. Разобрался, с выравниванием столбцов, всё заходит как надо. Сейчас встал вопрос как поместить таблицу в нужную страницу и строку (которая не является последней). В идеале заменив текст или какой либо тэг, для определения расположения в гугл доке. Пробовал через (replaceText) — не работает. Был бы очень признателен. Может есть какое ни будь решение для вставки на нужное место в гугл доке.
Добрый день.
Решение конечно же есть, я нечто подобное описывал тут