Katalog srovnany s tim, co opravdu bezi na services.csbot.cz/apps: trinact sluzeb dostalo pristupove udaje a levne cteci overeni, opravena appId, ktera nikam nevedla (ppl, microsoft365, transcription), a GA4, Search Console, Google Ads i Sklik ted stoji na aplikaci analytics, kazda s vlastnimi udaji. Nove sluzby SAP Business One, Google Workspace a Meta Ads. K tomu 23 skriptu, ktere s nimi opravdu neco delaji. OpenAI jako prvni sluzba, ktera nebezi u nas: Service.baseUrl s absolutni adresou, prepis pres <SLUZBA>_BASE_URL nebo adresu u konektoru, predpona hlavicky u pole udaju (uzivatel vlepi holy klic, Bearer dopise runtime). Dotaz na model, nahrani souboru, otazka nad souborem, prepis zvuku. Skript umi odeslat soubor pres ctx.http.postForm (multipart, obsah Base64). Sluzba E-mail pres SMTP. Neni to skript, ale vnitrni krok - SMTP neni HTTP. Konektor nese schranku firmy, krok ma HTML telo, ve kterem se dosazene hodnoty escapuji (znacky autora sablony jsou zamer, ostre zavorky od zakaznika ne). Overeni konektoru se prihlasi na server a nic neodesle. Helpdesk: Ticket.helpdeskSourceId drzi firmu, ktera pozadavek poslala, vlastnikem zustava ta, ktera ho resi - jinak by ho resitel nemel ve sve fronte. Komu pozadavek pripadne, urcuje Tenant.helpdeskProviderId. Zadavatel vidi jen svoje pozadavky a smi k nim pripsat komentar. Opravy v portalu: - hlasky o ulozisti a odchozi IP vidi jen spravce platformy - typ ticketu se v automatizaci vybira ze seznamu firmy, nebo dosadi z dat - stav ticketu je otevreny naseptavac, ne ciselnik - ticket jde zalozit rucne, zakaznik u nej neni povinny - kanal se prejmenoval a parametry u webhooku jsou oznacene jako nepovinne - srovnane markdown tabulky v cele dokumentaci Co z teto davky jeste neni: prepinac firmy je porad jen stav uvnitr stranky Prehled, takze se prepnuti neprojevi v Lidech ani jinde. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
93 lines
2.8 KiB
JavaScript
93 lines
2.8 KiB
JavaScript
/**
|
|
* Google Workspace: pripsani radku do tabulky.
|
|
*
|
|
* Sluzba: https://services.csbot.cz/apps/google-service
|
|
* Endpoint: POST /google/sheets/spreadsheets/{spreadsheetId}/values/append
|
|
*
|
|
* Tabulka se zadava odkazem, ne ID. Odkaz je to, co ma clovek v prohlizeci;
|
|
* ID z nej vytahne skript. Kdyby ho mel opisovat rucne, byl by to prvni zdroj
|
|
* chyb, ktery se pozna az podle prazdne tabulky.
|
|
*/
|
|
|
|
export const manifest = {
|
|
id: 'google.append-sheet-row',
|
|
name: 'Přidat řádek do tabulky',
|
|
description:
|
|
'Připíše řádek na konec listu v Google Tabulkách. Hodí se na evidenci ' +
|
|
'poptávek, objednávek nebo běhů automatizace.',
|
|
|
|
inputs: [
|
|
{
|
|
id: 'spreadsheet',
|
|
label: 'Tabulka',
|
|
type: 'string',
|
|
required: true,
|
|
hint: 'Odkaz na tabulku z prohlížeče, nebo samotné ID.',
|
|
},
|
|
{
|
|
id: 'sheetName',
|
|
label: 'Název listu',
|
|
type: 'string',
|
|
required: false,
|
|
default: 'List1',
|
|
hint: 'Přesně tak, jak je napsaný na záložce dole.',
|
|
},
|
|
{
|
|
id: 'values',
|
|
label: 'Hodnoty řádku',
|
|
type: 'list',
|
|
required: true,
|
|
hint: 'Seznam hodnot zleva doprava, například ["2026-08-26", "Nová poptávka", 1200].',
|
|
},
|
|
],
|
|
|
|
outputs: [
|
|
{ id: 'updatedRange', label: 'Kam se zapsalo', type: 'string', required: true },
|
|
{ id: 'updatedCells', label: 'Počet zapsaných buněk', type: 'number', required: false },
|
|
{ id: 'spreadsheetId', label: 'ID tabulky', type: 'string', required: true },
|
|
],
|
|
|
|
timeoutMs: 30000,
|
|
};
|
|
|
|
/**
|
|
* ID tabulky z odkazu.
|
|
*
|
|
* Odkaz ma tvar .../spreadsheets/d/<id>/edit. Kdyz uzivatel vlozi rovnou ID,
|
|
* projde beze zmeny - obe cesty vedou ke stejnemu vysledku.
|
|
*/
|
|
function spreadsheetId(value) {
|
|
const match = /\/spreadsheets\/d\/([a-zA-Z0-9-_]+)/.exec(value);
|
|
return match ? match[1] : value.trim();
|
|
}
|
|
|
|
export async function run(inputs, ctx) {
|
|
const { pick, text, num, need } = ctx.util;
|
|
|
|
if (inputs.values.length === 0) ctx.fail('Řádek nemá žádné hodnoty.');
|
|
|
|
const id = spreadsheetId(inputs.spreadsheet);
|
|
// Rozsah je jen nazev listu: append si sam najde prvni volny radek.
|
|
const range = inputs.sheetName;
|
|
|
|
const { body } = await ctx.http.post(
|
|
`/google/sheets/spreadsheets/${encodeURIComponent(id)}/values/append`,
|
|
{
|
|
range,
|
|
majorDimension: 'ROWS',
|
|
// Vsechno na text: Sheets si cisla i data prevede samo podle formatu
|
|
// bunky, kdezto smisene typy v jednom poli odmita.
|
|
values: [inputs.values.map((value) => (value === null ? '' : String(value)))],
|
|
},
|
|
{ query: { range } },
|
|
);
|
|
|
|
const updates = pick(body, 'updates') ?? body;
|
|
|
|
return {
|
|
updatedRange: need(text(pick(updates, 'updatedRange')), 'zapsaný rozsah'),
|
|
updatedCells: num(pick(updates, 'updatedCells')),
|
|
spreadsheetId: id,
|
|
};
|
|
}
|