Интернет-магазин нашего клиента использует Opencart, в маркетинговых целях он хотел автоматически синхронизировать заказы Opencart с Google Sheets. Я изменил скрипт в листах Google для извлечения заказов клиентов за прошлый год (на основе https://www.transpacific -software.com / blog / opencart-to-google-docs-pull-and-sync-data-auto-through -скрипт и https://gist.github.com/pradeepbheron/e6129c9fd9bc74e814d0)
SQL-запрос:
SELECT order_id, firstname AS first_name, lastname AS last_name,
email, date_added AS order_date, CONCAT("£", FORMAT(total,2))
order_value, payment_address_1 AS billing_address_1,
payment_address_2 AS billing_address_2, payment_city AS
billing_city, payment_postcode AS billing_postcode,
payment_country AS billing_country, items_purchased FROM
(
SELECT order_id, firstname, lastname, email, date_added,
total, payment_address_1, payment_address_2, payment_city,
payment_postcode, payment_country
FROM ocbw_order
GROUP BY order_id
) AS A
JOIN (
SELECT order_id AS product_order_id, GROUP_CONCAT(name
SEPARATOR ", ") AS items_purchased
FROM ocbw_order_product
GROUP BY product_order_id
) AS B
ON A.order_id=B.product_order_id
WHERE date_added >= DATE_SUB(NOW(),INTERVAL 1 YEAR)
AND firstname != ''
В phpMyAdmin он работает нормально, но Google Script Editor генерирует ошибку «Превышено максимальное время выполнения».
Похоже, что есть 7357 строк (экспортировано из myPhpAdmin). Есть ли лучший способ написать запрос? Также я пытаюсь переименовать заголовки столбцов, но могу только две работы, то есть:
GROUP_CONCAT(name SEPARATOR ", ") AS items_purchased
и
CONCAT("£", FORMAT(total,2)) order_value
Любые мысли
БЫСТРОЕ ОБНОВЛЕНИЕ: пт 9 ноября 11:54:03 2018
1) По запросу @ThisGuyHasTwoThumbs приведен скриншот результата таблицы объяснения
2) Я заглянул в документ Best Practices, упомянутый @bcperth. Я попытался переписать скрипт google листов, но столкнулся с проблемами.
Вот исправленный скрипт.
function p1MySQLFetchData() {
// Change it as per your database credentials
var conn =
Jdbc.getConnection('jdbc:mysql://[dbHostIp]:3306/[dbName]',
'[dbUsername]', '[dbPassword]');
var stmt = conn.createStatement();
var start = new Date(); // Get script starting time
//change table name as per your database structure
var rs = stmt.executeQuery('[sqlQuery]');
// It sets the limit of the
// maximum nuber of rows in a ResultSet object
// Returns the currently active spreadsheet
var doc = SpreadsheetApp.getActiveSpreadsheet();
var cell = doc.getRange('a1');
var row = 0;
// Mysql table column name count.
var getCount = rs.getMetaData().getColumnCount();
// Create array to hold mysql data
var tempArray = [];
// get row and column count for later
var colCount = getCount;
// ATTEMPT TO GET ROW COUNT 1
//rs.last();
//var rowCount = rs.getRow();
//rs.beforeFirst(); // resets rs cursor
//Logger.log(RowCount);
// DOESN'T WORK! result => ReferenceError: "RowCount" is not
// defined. (line 28, file "Code")
// ATTEMPT TO GET ROW COUNT 2
//var rsCount = stmt.executeQuery('SELECT COUNT(*) AS rowcount FROM
//[sqlQuery]);
// It sets the limit of the maximum number of rows in a ResultSet
// object
//rsCount.next();
//var rowCount = rsCount.getString("rowcount");
//Logger.log(rowCount);
// DOESN'T WORK! result => 0
// Build TempArray using MySQL data
for (var i = 0; i < getCount; i++){
tempArray[0][i] = rs.getMetaData().getColumnName(i+1);
// DOESNT WORK => ERROR
// TypeError: Cannot set property "0.0" of undefined to "order_id".
// (line 39, file "Code")
//Logger.log(rs.getMetaData().getColumnName(i+1));
}
var row = 1;
while (rs.next()) {
for (var col = 0; col < rs.getMetaData().getColumnCount();
col++) {
tempArray[row][col] = rs.getString(col + 1);
//Logger.log(rs.getString(col + 1));
}
row++;
}
// BELOW DOESNT AS I CANT GET A ROW COUNT (SEE ABOVE)
// Fill Spreadsheet from tempArray
//for (var row = 0; row < rowCount; row++) {
//for (var col = 0; col < colCount; col++) {
//cell.offset(row, col).setValue(tempArray[row][col + 1]);
//}
// }
rs.close();
stmt.close();
conn.close();
var end = new Date(); // Get script ending time
Logger.log('Time elapsed: ' + (end.getTime() - start.getTime()));
// To generate script log. To view log click on View -> Logs.
}
Но, как вы можете видеть из комментариев, я получаю массу ошибок. Не уверен, что делать дальше.
ОБНОВЛЕНИЕ Пт 30 ноября 15:26:14 2018
В ответ на комментарий @Tedinoz ниже.
PhpMyAdmin генерирует 6862 результатов, а запрос занял 13.3074 секунды.
Когда я запустил скрипт в редакторе скриптов Googles, его выполнение заняло около 2 минут 30 минут и извлекает только 6348 записей (92,5%). Записи прекращаются после 3 октября 2018 года.
Относительно ваших предложений:
1) Я попытался запустить модифицированный скрипт, установив ИНТЕРВАЛ на:
- 1 МЕСЯЦ => Я не получаю результатов в Google (должно быть 529)
- 2 МЕСЯЦА => Я получаю 14 результатов (должно быть 1029)
- 3 МЕСЯЦА => Я получил 299 результатов (должно быть 1669).
Все они заняли около 4-7 секунд в myPhpAdmin против 5–20 секунд в Google Script Editor
2) Вы имеете в виду экспорт CSV из phpMyAdmin и импорт в Google Sheets? Ну, я сделал это, и все работает отлично.
Еще одна вещь, которую я заметил, это то, что order_id в Google Sheets не совпадает с phpMyAdmin. Weird.