Программное обновление электронной таблицы, размещенной в Google Документах - PullRequest
8 голосов
/ 03 декабря 2009

У меня есть уже существующая электронная таблица, размещенная на Google Docs. Каждый месяц я обновляю этот документ. В таблице есть шаблон рабочего листа, который я хотел бы клонировать, а затем обновить.

Я бы предпочел клонировать рабочий лист, а не создавать его с нуля, так как он имеет несколько довольно сложных формул.

Я использую API Python для документации Google здесь:

http://code.google.com/apis/spreadsheets/data/1.0/developers_guide_python.html

Кто-нибудь знает, как клонировать и скопировать рабочий лист в уже существующий документ?

Редактировать

Кажется, я запутал одного читателя. У меня нет таблицы Excel. У меня есть только электронная таблица Документов Google с таблицей шаблонов.

Я бы хотел клонировать этот лист, переименовать его и затем редактировать программно.

Ответы [ 6 ]

6 голосов
/ 02 ноября 2010
  1. Клонируйте свой шаблон листа, используя инструкции Копирование документов
  2. Откройте список рабочих листов в клонированном документе и перейдите к нужной электронной таблице.
  3. Используйте фид ячеек , чтобы получить соответствующую ячейку в вашей электронной таблице, затем обновите значения.
4 голосов
/ 03 января 2012

Вау !!! Задний грузовик. Есть гораздо более простой подход

За последние несколько недель я немного исследовал это, потому что я планирую сделать то же самое для моих ежемесячных отчетов. У меня пока нет конкретного кода, но я буду добавлять его по мере прогресса.

В Google Docs так много API и подобных терминов, связанных с работой с документами, что это может немного запутать. Если вы еще не знаете, установите в своей голове тот факт, что GAS (Google Apps Scripting) и GAE (Google App Engine) - это две совершенно разные вещи. Хотя они звучат так же, как и Java, они похожи на JavaScript.

GAS - это записи, встроенные в Google Docs (которые, как мы надеемся, в будущем будут импортированы как отдельные модули), которые управляют такими вещами, как проверка и динамические документы, но они намного более мощные, чем большинство подозреваемых (они могут делать такие вещи, как изменять / обновлять внешние документы и автоответчики). Имейте в виду, что они должны быть легкими, потому что они работают на серверах Google. Если ваш сценарий занимает много времени, чтобы завершить его выполнение будет преждевременно оборвано (поискать ограничения можно в Google). Это означает, что вы должны использовать только vanilla JS (без фреймворков, таких как jQuery) и настройки производительности везде, где это возможно.

GAE, с другой стороны, похож на веб-сервер (с доступным слоем базы данных), который живет где-то в облаке. Он существует в качестве удобного (и уже развернутого) уровня промежуточного программного обеспечения для предприятий / интересов для создания пользовательских приложений для более тяжелой работы. К сожалению, внешний API-интерфейс Spreadsheet слишком ограничен, чтобы выполнять то, над чем мы работаем, сам по себе, поэтому это не вариант.

Автоматизация с использованием скриптов Google Apps и триггеров на основе времени

Этот подход должен работать, но требует немного хакерского подхода.

Откройте книгу, содержащую ваши отчеты. Нажмите [Инструменты] -> [Редактор скриптов ...]. Перейдя в [Триггеры] -> [Триггеры текущего скрипта ...].

Если у вас нет триггеров, добавьте один. Затем в раскрывающемся меню «События» выберите «Время-управляемый».

Добро пожаловать в мир серверных обработчиков событий. Одной из полезных функций, которые вы получаете с облачными документами, является возможность запуска заданий cron непосредственно в вашем документе. Внешнее промежуточное программное обеспечение не требуется.

Если вы еще не заметили, нет триггера для «Таймера месяца». Вот где это становится хакерским. Чтобы обойти отсутствие этой функции, потребуется ежедневно запускать триггер и использовать некоторый JavaScript, чтобы сопоставить текущую дату с датой предыдущего дня.

[код будет здесь]

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

[код будет здесь]

Ваш, очевидно, будет немного отличаться от моего, но основная концепция:

  • Загрузить объект SpreadSheet (не путать с объектом Sheet)
  • Найдите шаблон объекта Sheet
  • Клонируйте шаблон листа, присвоив ему соответствующее имя на основе диапазона дат

В моем следующем шаге я буду извлекать данные за месяц, чтобы сгенерировать линейный график с накоплением, чтобы сообщить текущему статусу моих руководителей.

Примечание. Из-за многопользовательской совместной работы над документами события должны запускаться на стороне сервера. Это создает для нас большую проблему. Поскольку код события выполняется в другом месте, если код содержит ошибки, мы не получаем никакой обратной связи от нашего браузера. Единственное решение для этого - настроить уведомление на триггере, чтобы он немедленно отправлял вам электронное письмо при сбое скрипта .

Обновление: во время исследования я нашел еще одну классную технику. Если мне удастся заставить это работать без ошибок, я мог бы попытаться вызвать триггер, используя дату, отмеченную в Календаре Google.

2 голосов
/ 09 декабря 2009

Прежде всего, я никогда раньше не работал с Python - но я расскажу вам, как я это делал в C ++.

Я использовал cURL для запроса GET к API документов Google . Двоичные данные файла были возвращены, и я записал это в файл. Теперь у меня был файл XLS, а затем я использовал библиотеку C / C ++, которая могла читать файлы XLS, чтобы манипулировать загруженным файлом. API, который я использовал, поддерживал множество опций; Вы можете сделать все, что вы могли бы сделать в Excel. После внесения изменений я снова загрузил его в Документы Google.

2 голосов
/ 07 декабря 2009

Это действительно сложно. Я понимаю, что вы можете редактировать свои электронные таблицы с помощью Python, используя их API, Google стремится предложить такую ​​возможность во многих своих веб-службах, и все это делается путем отправки HTTP-запросов на публикацию сообщений, сделанных из XML, надеюсь, вы знаете эту часть т.

В соответствии с этим вы можете по крайней мере добавлять рабочие листы, читать строки из других рабочих листов и записывать строки в рабочие таблицы. если нужно, вы можете скопировать его по одной строке за раз, однако отправка дополнительного запроса POST для каждой строки кажется ужасной идеей.

Edit:

Я все больше и больше узнаю об этом, но до решения исходной проблемы еще далеко. Этот обзор принципов REST описывает базовый стиль взаимодействия между программами в Интернете. Похоже, Google следит за ним неукоснительно.

Все это происходит в протоколе HTTP, о чем я ничего не знал до сегодняшнего дня. В этой спецификации HTTP изложена основная игра. Это не так сухо, как кажется, и, может быть, я просто огромный фанат, но я нахожу это вдохновляющим чтением. Не отличается от Конституции Соединенных Штатов.

Таким образом, поскольку вы хотите «клонировать» документ, вы будете использовать запрос GET для определенного листа, а затем отправлять этот лист обратно в качестве полезной нагрузки POST.

Становится ближе:)

1 голос
/ 09 декабря 2009

Не могли бы вы экспортировать электронную таблицу в формате xls, а затем загрузить ее как новый документ с (немного) другим именем, указав новое имя в метаданных XML?

Разделы «Загрузка» и «Создание / выгрузка документа» на http://code.google.com/apis/documents/overview.html должны быть полезными.

Я не могу сразу увидеть какие-либо функции импорта / экспорта в документации Python API, но отправка нескольких http-запросов не так уж и плоха.

0 голосов
/ 28 февраля 2017

(февраль 2017 г.) Перефразирование вопроса с использованием текущей терминологии: Как скопировать шаблон Google Sheet, а затем изменить его (копию) программным способом? Краткий ответ: это намного проще с текущие API Google, в частности Google Drive v3 API и Google Sheets v4 API , и вы можете сделать это на любом языке, поддерживаемом клиентскими библиотеками Google APIs .

Последний API Sheets предоставляет функции, недоступные в более ранних версиях, а именно предоставляет разработчикам программный доступ к Sheet, как если бы вы использовали пользовательский интерфейс (т. Е.), То есть создание замороженных строк, форматирование ячеек, изменение размера строк / столбцов, добавление сводные таблицы, проверка ячеек, создание диаграмм и т. д.

Как вы можете догадаться, API Sheets в первую очередь предназначен для программного доступа к операциям и функциям электронной таблицы, как описано выше, но для выполнения file -level access , таких как копирование шаблона Sheet, используйте взамен Google Drive API .

Псевдокод (Python) для копирования файла (Sheet) с помощью Drive API (при условии, что мы сначала ищем последний измененный файл с именем шаблона, отсюда orderBy и выбор первого результата [0] ниже) :

TMPLFILE = 'my Sheets template'
tmpl = DRIVE.files().list(q="name='%s'" % TMPLFILE).execute().get('files')[0]
NEW_SHEET = {'name': 'Sheets data, Feb 2017'}
SHEET_ID = DRIVE.files().copy(body=NEW_SHEET, fileId=tmpl['id']).execute().get('id')

Псевдокод для чтения значений из базы данных SQL (SQLite) и записи их в новый созданный выше лист (начиная с ячейки «A1» как «левый верхний»), как если бы пользователь вводил значения из пользовательского интерфейса (так что формулы можно применять и т. д.):

cxn = sqlite3.connect('db.sqlite')
cur = cxn.cursor()
rows = cur.execute('SELECT * FROM data').fetchall()
cxn.close()
DATA = {'values': rows}
SHEETS.spreadsheets().values().update(spreadsheetId=SHEET_ID,
    range='A1', body=DATA, valueInputOption='USER_ENTERED').execute()

Если вы относительно плохо знакомы с современными API Google, у меня есть (несколько устаревшее, но) удобное для пользователя вступительное видео для вас. После этого есть еще два видео, в том числе одно, демонстрирующее использование Drive API. Это видео 2, 3 и 4 в этом плейлисте . Видео 23 и 25 - это еще одна пара, в которой представлены API-интерфейсы Drive и Sheets.

Все новые видео можно найти в этом плейлисте , где вы найдете еще одну пару видео с API-интерфейсом Sheets, а также повторный код "копирования шаблонов" выше, но с копированием шаблона Slides, который затем изменено с помощью Slides API ) (видео 2).

Как уже упоминалось в другом ответе, вы также можете использовать Google Apps Script , чтобы сделать что-то похожее, если вы предпочитаете эту среду по сравнению с использованием REST API, хотя Apps Script в настоящее время использует более старые API. Также есть несколько выдающихся ошибок, которые могут сделать его более сложным (в частности, этот и этот ).

...