Как быстро подключить склад из гугл таблицы к поиску на Prom-Stock?

Date Published

Straight metallic shapes with a blue gradient

Эта инструкция позволит вам настроить API для подключения вашей Google Таблицы к поиску на странице Склад.

🔧 Шаг 1. Подготовьте таблицу

Создайте Google Таблицу (или скопируйте из примера) со следующими столбцами:

sku | description | category | brand | quantity | newdelivery_qty_1 | newdelivery_date_1 | newdelivery_qty_2 | newdelivery_date_2

Пример таблицы и файла скрипта: 👉 Ссылка на Google Диск с примером

👉 Минимально обязательные поля: sku, description, quantity. Остальные можно оставить пустыми.

Шаг 2. Настройка скрипта API

Откройте вашу Google Таблицу.

В меню выберите: Расширения → Apps Script.

AppScriptOpen


Замените содержимое файла этим скриптом:

1const API_CONFIG = {
2 SECRET_TOKEN: "ваш_секретный_токен",
3 SPREADSHEET_ID: "аш_ID_таблицы",
4 DEFAULT_PER_PAGE: 5,
5 MAX_PER_PAGE: 50,
6 CACHE_DURATION: 300
7};
8
9function testDoGet() {
10 const mockRequest = {
11 parameter: {
12 page: "1",
13 per_page: "5",
14 filters: JSON.stringify({ sku: "1045", description: "" }),
15 sort_by: "sku",
16 sort_order: "asc",
17 token: API_CONFIG.SECRET_TOKEN
18 }
19 };
20
21 const result = doGet(mockRequest);
22 Logger.log("Результат теста:\n" + result.getContent());
23 return result;
24}
25
26function doGet(e) {
27 e = e || {};
28 e.parameter = e.parameter || {};
29
30 try {
31 const requestToken = e.parameter.token;
32 if (!requestToken || requestToken !== API_CONFIG.SECRET_TOKEN) {
33 throw new Error("Неверный токен доступа.");
34 }
35
36 const sheet = SpreadsheetApp.openById(API_CONFIG.SPREADSHEET_ID).getSheetByName("Лист1");
37 const values = sheet.getDataRange().getValues();
38 const headers = values.shift();
39 const formattedHeaders = headers.map(h => h.toString().toLowerCase().replace(/\s+/g, "_"));
40
41 const params = parseRequestParameters(e.parameter);
42
43 let processedData = values.map(row => {
44 return formattedHeaders.reduce((obj, key, i) => {
45 obj[key] = row[i];
46 return obj;
47 }, {});
48 });
49
50 if (params.filters) {
51 try {
52 const skuFilter = cleanSku(params.filters.sku || "");
53 const descFilter = (params.filters.description || "").toLowerCase().trim();
54
55 if (skuFilter || descFilter) {
56 processedData = processedData.filter(row => {
57 try {
58 const rowSku = cleanSku(String(row.sku || ""));
59 const rowDesc = (row.description || "").toLowerCase().trim();
60
61 const matchSku = skuFilter ? rowSku.includes(skuFilter) : true;
62 const matchDesc = descFilter ? rowDesc.includes(descFilter) : true;
63
64 return matchSku && matchDesc;
65 } catch (e) {
66 console.error(`Ошибка обработки строки: ${JSON.stringify(row)}`, e);
67 return false;
68 }
69 });
70 }
71 } catch (e) {
72 console.error("Ошибка в параметрах фильтрации:", e);
73 return [];
74 }
75 }
76
77 function cleanSku(sku) {
78 if (!sku) return "";
79
80 return sku
81 .toString()
82 .toLowerCase()
83 .replace(/[\s()\-_]/g, "")
84 .replace(/[^\w]/g, "");
85 }
86
87
88 if (params.sort_by && formattedHeaders.includes(params.sort_by)) {
89 processedData.sort((a, b) => {
90 const cmp = compareValues(a[params.sort_by], b[params.sort_by]);
91 return params.sort_order === "desc" ? -cmp : cmp;
92 });
93 }
94
95
96 const paginatedData = applyPagination(processedData, params);
97
98
99 const response = buildResponse(paginatedData, processedData.length, params);
100
101 return cacheAndReturnResponse(response, e.parameter);
102 } catch (error) {
103 Logger.log(`Ошибка API: ${error.message}\n${error.stack}`);
104 return buildErrorResponse(error.message, 401);
105 }
106}
107
108
109function parseRequestParameters(params) {
110 return {
111 page: Math.max(1, parseInt(params.page) || 1),
112 per_page: Math.min(
113 API_CONFIG.MAX_PER_PAGE,
114 Math.max(1, parseInt(params.per_page) || API_CONFIG.DEFAULT_PER_PAGE)
115 ),
116 sort_by: params.sort_by,
117 sort_order: params.sort_order === "desc" ? "desc" : "asc",
118 filters: safeJsonParse(params.filters),
119 token: params.token
120 };
121}
122
123function applyPagination(items, params) {
124 const startIdx = (params.page - 1) * params.per_page;
125 return items.slice(startIdx, startIdx + params.per_page);
126}
127
128function buildResponse(data, totalItems, params) {
129 return {
130 meta: {
131 page: params.page,
132 per_page: params.per_page,
133 total: totalItems,
134 total_pages: Math.ceil(totalItems / params.per_page),
135 sort_by: params.sort_by,
136 sort_order: params.sort_order
137 },
138 data: data
139 };
140}
141
142function cacheAndReturnResponse(response, params) {
143 const cacheKey = JSON.stringify(params);
144 const cached = CacheService.getScriptCache().get(cacheKey);
145
146 if (cached) {
147 Logger.log("Используем данные из кэша");
148 return buildJsonResponse(cached);
149 }
150
151 const jsonResponse = JSON.stringify(response);
152 CacheService.getScriptCache().put(cacheKey, jsonResponse, API_CONFIG.CACHE_DURATION);
153
154 return buildJsonResponse(jsonResponse);
155}
156
157function compareValues(a, b) {
158 if (a === b) return 0;
159 return a < b ? -1 : 1;
160}
161
162function safeJsonParse(str) {
163 try {
164 return str ? JSON.parse(str) : null;
165 } catch (e) {
166 Logger.log(`Ошибка парсинга JSON: ${str}`);
167 return null;
168 }
169}
170
171function buildJsonResponse(data) {
172 return ContentService.createTextOutput(data)
173 .setMimeType(ContentService.MimeType.JSON);
174}
175
176function buildErrorResponse(message, status) {
177 return buildJsonResponse(JSON.stringify({
178 error: true,
179 message: message,
180 status: status
181 }));
182}
183

В начале скрипта найдите блок конфигурации API_CONFIG и укажите:

SECRET_TOKEN: "придумайте секретный токен",

SPREADSHEET_ID: "ваш_ID_таблицы",

SHEET_NAME: "Проверьте имя листа, должно совпадать",

🧩 SPREADSHEET_ID находится в URL таблицы:

"https://docs.google.com/spreadsheets/d/1AbCDeFGhiJKlmNOPqRStuVWxyZ1234567890/edit"

🚀 Шаг 3. Разверните как веб-приложение

В Apps Script нажмите Развертывание → Новое развертывание.

В типе развертывания выберите Веб-приложение.

Заполните:

Описание: API

Кто имеет доступ: Все, включая анонимных

Выполняется от имени: вас (владельца)

Нажмите Развернуть — скрипт запросит разрешения, подтвердите доступ.

Получите URL веб-приложения — это и будет ваш API URL.

API URL


🔐 Шаг 3. Подключение к API

Теперь в личном кабинете в разделе Профиль и инфо о компании откройте Профиль Копании, и кликните на компанию, что бы открыть панель настроек.

cpmpany_profile-view

Список компаний


переключившись во вкладку "API настройки", вы раздел Подключение к API можете указать поля:

API URL

API Token

Тип API

google_api_connect

API настройки


API Token - это ваш SECRET_TOKEN.

API Url - URL Веб-приложение из развертывания.