@squadbase/vite-server 0.1.17-dev.24af54e → 0.1.17-dev.423ee34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +4873 -1073
- package/dist/connectors/airtable-oauth.js +78 -11
- package/dist/connectors/airtable.js +74 -11
- package/dist/connectors/amplitude.js +38 -11
- package/dist/connectors/anthropic.js +4 -2
- package/dist/connectors/asana.js +67 -13
- package/dist/connectors/attio.js +60 -16
- package/dist/connectors/aws-billing.js +38 -11
- package/dist/connectors/azure-sql.js +64 -13
- package/dist/connectors/backlog-api-key.js +70 -18
- package/dist/connectors/clickup.js +80 -13
- package/dist/connectors/cosmosdb.js +42 -15
- package/dist/connectors/customerio.js +39 -12
- package/dist/connectors/dbt.js +716 -28
- package/dist/connectors/freshdesk.js +112 -11
- package/dist/connectors/freshsales.js +38 -11
- package/dist/connectors/freshservice.js +38 -11
- package/dist/connectors/gamma.js +47 -20
- package/dist/connectors/gemini.js +4 -2
- package/dist/connectors/github.js +42 -15
- package/dist/connectors/gmail-oauth.js +38 -13
- package/dist/connectors/gmail.js +34 -7
- package/dist/connectors/google-ads.js +38 -11
- package/dist/connectors/google-analytics-oauth.js +182 -28
- package/dist/connectors/google-analytics.js +653 -104
- package/dist/connectors/google-audit-log.js +34 -7
- package/dist/connectors/google-calendar-oauth.js +91 -18
- package/dist/connectors/google-calendar.js +91 -14
- package/dist/connectors/google-docs.js +38 -13
- package/dist/connectors/google-drive.js +60 -13
- package/dist/connectors/google-search-console-oauth.js +156 -20
- package/dist/connectors/google-sheets.js +36 -9
- package/dist/connectors/google-slides.js +38 -13
- package/dist/connectors/grafana.js +75 -13
- package/dist/connectors/hubspot-oauth.js +69 -12
- package/dist/connectors/hubspot.js +55 -12
- package/dist/connectors/influxdb.js +38 -11
- package/dist/connectors/intercom-oauth.js +100 -15
- package/dist/connectors/intercom.js +42 -15
- package/dist/connectors/jdbc.js +36 -9
- package/dist/connectors/jira-api-key.js +98 -14
- package/dist/connectors/kintone-api-token.js +96 -21
- package/dist/connectors/kintone.js +84 -14
- package/dist/connectors/linear.js +84 -15
- package/dist/connectors/linkedin-ads.js +71 -17
- package/dist/connectors/mailchimp-oauth.js +36 -9
- package/dist/connectors/mailchimp.js +36 -9
- package/dist/connectors/meta-ads-oauth.js +63 -17
- package/dist/connectors/meta-ads.js +65 -17
- package/dist/connectors/mixpanel.js +38 -11
- package/dist/connectors/monday.js +39 -12
- package/dist/connectors/mongodb.js +38 -11
- package/dist/connectors/notion-oauth.js +88 -14
- package/dist/connectors/notion.js +90 -14
- package/dist/connectors/openai.js +4 -2
- package/dist/connectors/oracle.js +78 -20
- package/dist/connectors/outlook-oauth.js +48 -23
- package/dist/connectors/powerbi-oauth.js +321 -49
- package/dist/connectors/salesforce.js +72 -12
- package/dist/connectors/semrush.js +374 -52
- package/dist/connectors/sentry.js +66 -13
- package/dist/connectors/shopify-oauth.js +71 -13
- package/dist/connectors/shopify.js +38 -11
- package/dist/connectors/sqlserver.js +64 -13
- package/dist/connectors/stripe-api-key.js +96 -18
- package/dist/connectors/stripe-oauth.js +98 -22
- package/dist/connectors/supabase.js +55 -11
- package/dist/connectors/tableau.js +262 -92
- package/dist/connectors/tiktok-ads.js +67 -19
- package/dist/connectors/wix-store.js +38 -11
- package/dist/connectors/zendesk-oauth.js +83 -15
- package/dist/connectors/zendesk.js +42 -15
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4902 -1077
- package/dist/main.js +4891 -1071
- package/dist/vite-plugin.js +4871 -1071
- package/package.json +1 -1
|
@@ -16,6 +16,7 @@ var init_parameter_definition = __esm({
|
|
|
16
16
|
type;
|
|
17
17
|
secret;
|
|
18
18
|
required;
|
|
19
|
+
isDeprecated;
|
|
19
20
|
constructor(config) {
|
|
20
21
|
this.slug = config.slug;
|
|
21
22
|
this.name = config.name;
|
|
@@ -24,6 +25,7 @@ var init_parameter_definition = __esm({
|
|
|
24
25
|
this.type = config.type;
|
|
25
26
|
this.secret = config.secret;
|
|
26
27
|
this.required = config.required;
|
|
28
|
+
this.isDeprecated = config.isDeprecated ?? false;
|
|
27
29
|
}
|
|
28
30
|
/**
|
|
29
31
|
* Get the parameter value from a ConnectorConnectionObject.
|
|
@@ -253,7 +255,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
253
255
|
/**
|
|
254
256
|
* Create tools for connections that belong to this connector.
|
|
255
257
|
* Filters connections by connectorKey internally.
|
|
256
|
-
* Returns tools keyed as
|
|
258
|
+
* Returns tools keyed as `connector_${connectorKey}_${toolName}`.
|
|
257
259
|
*/
|
|
258
260
|
createTools(connections, config, opts) {
|
|
259
261
|
const myConnections = connections.filter(
|
|
@@ -263,7 +265,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
263
265
|
for (const t of Object.values(this.tools)) {
|
|
264
266
|
const tool = t.createTool(myConnections, config);
|
|
265
267
|
const originalToModelOutput = tool.toModelOutput;
|
|
266
|
-
result[
|
|
268
|
+
result[`connector_${this.connectorKey}_${t.name}`] = {
|
|
267
269
|
...tool,
|
|
268
270
|
toModelOutput: async (options) => {
|
|
269
271
|
if (!originalToModelOutput) {
|
|
@@ -319,19 +321,34 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
319
321
|
};
|
|
320
322
|
let state = flow.initialState();
|
|
321
323
|
let answerIdx = 0;
|
|
324
|
+
const pendingParameterUpdates = [];
|
|
322
325
|
for (const step of flow.steps) {
|
|
323
326
|
const ans = ctx.answers[answerIdx];
|
|
324
327
|
if (ans && ans.questionSlug === step.slug) {
|
|
325
328
|
state = step.applyAnswer(state, ans.answer);
|
|
329
|
+
if (step.toParameterUpdates) {
|
|
330
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
331
|
+
}
|
|
326
332
|
answerIdx += 1;
|
|
327
333
|
continue;
|
|
328
334
|
}
|
|
335
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
329
336
|
if (step.type === "text") {
|
|
337
|
+
if (step.fetchOptions) {
|
|
338
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
339
|
+
if (options2.length === 0) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
330
343
|
return {
|
|
331
344
|
type: "nextQuestion",
|
|
332
345
|
questionSlug: step.slug,
|
|
333
346
|
question: step.question[ctx.language],
|
|
334
|
-
questionType: "text"
|
|
347
|
+
questionType: "text",
|
|
348
|
+
allowFreeText: resolvedAllowFreeText,
|
|
349
|
+
...pendingParameterUpdates.length > 0 && {
|
|
350
|
+
parameterUpdates: pendingParameterUpdates
|
|
351
|
+
}
|
|
335
352
|
};
|
|
336
353
|
}
|
|
337
354
|
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
@@ -343,11 +360,21 @@ async function runSetupFlow(flow, params, ctx, config) {
|
|
|
343
360
|
questionSlug: step.slug,
|
|
344
361
|
question: step.question[ctx.language],
|
|
345
362
|
questionType: step.type,
|
|
346
|
-
options
|
|
363
|
+
options,
|
|
364
|
+
allowFreeText: resolvedAllowFreeText,
|
|
365
|
+
...pendingParameterUpdates.length > 0 && {
|
|
366
|
+
parameterUpdates: pendingParameterUpdates
|
|
367
|
+
}
|
|
347
368
|
};
|
|
348
369
|
}
|
|
349
370
|
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
350
|
-
return {
|
|
371
|
+
return {
|
|
372
|
+
type: "fulfilled",
|
|
373
|
+
dataInvestigationResult,
|
|
374
|
+
...pendingParameterUpdates.length > 0 && {
|
|
375
|
+
parameterUpdates: pendingParameterUpdates
|
|
376
|
+
}
|
|
377
|
+
};
|
|
351
378
|
}
|
|
352
379
|
async function resolveSetupSelection(params) {
|
|
353
380
|
const { selected, allSentinel, fetchAll, limit } = params;
|
|
@@ -638,15 +665,16 @@ var googleAnalyticsOauthOnboarding = new ConnectorOnboarding({
|
|
|
638
665
|
- Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
|
|
639
666
|
},
|
|
640
667
|
dataOverviewInstructions: {
|
|
641
|
-
en: `1. Call
|
|
642
|
-
2. Call
|
|
643
|
-
ja: `1.
|
|
644
|
-
2.
|
|
668
|
+
en: `1. Call connector_google-analytics-oauth_request with GET properties/{propertyId}/metadata to list available dimensions and metrics
|
|
669
|
+
2. Call connector_google-analytics-oauth_request with POST properties/{propertyId}:runReport using a small date range and basic metrics to verify data availability`,
|
|
670
|
+
ja: `1. connector_google-analytics-oauth_request \u3067 GET properties/{propertyId}/metadata \u3092\u547C\u3073\u51FA\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3\u3068\u30E1\u30C8\u30EA\u30AF\u30B9\u306E\u4E00\u89A7\u3092\u53D6\u5F97
|
|
671
|
+
2. connector_google-analytics-oauth_request \u3067 POST properties/{propertyId}:runReport \u3092\u77ED\u3044\u671F\u9593\u3068\u57FA\u672C\u30E1\u30C8\u30EA\u30AF\u30B9\u3067\u547C\u3073\u51FA\u3057\u3001\u30C7\u30FC\u30BF\u306E\u53EF\u7528\u6027\u3092\u78BA\u8A8D`
|
|
645
672
|
}
|
|
646
673
|
});
|
|
647
674
|
|
|
648
675
|
// ../connectors/src/connectors/google-analytics-oauth/setup-flow.ts
|
|
649
676
|
var ADMIN_BASE_URL3 = "https://analyticsadmin.googleapis.com/v1beta";
|
|
677
|
+
var DATA_BASE_URL = "https://analyticsdata.googleapis.com/v1beta";
|
|
650
678
|
var ALL_PROPERTIES = "__ALL_PROPERTIES__";
|
|
651
679
|
var GOOGLE_ANALYTICS_OAUTH_SETUP_MAX_PROPERTIES = 20;
|
|
652
680
|
async function listAccountSummaries(proxyFetch) {
|
|
@@ -677,6 +705,44 @@ async function getProperty(proxyFetch, propertyId) {
|
|
|
677
705
|
if (!res.ok) return null;
|
|
678
706
|
return await res.json();
|
|
679
707
|
}
|
|
708
|
+
async function getMetadata(proxyFetch, propertyId) {
|
|
709
|
+
try {
|
|
710
|
+
const res = await proxyFetch(
|
|
711
|
+
`${DATA_BASE_URL}/properties/${propertyId}/metadata`,
|
|
712
|
+
{ method: "GET" }
|
|
713
|
+
);
|
|
714
|
+
if (!res.ok) return { dimensions: [], metrics: [] };
|
|
715
|
+
const data = await res.json();
|
|
716
|
+
return {
|
|
717
|
+
dimensions: data.dimensions ?? [],
|
|
718
|
+
metrics: data.metrics ?? []
|
|
719
|
+
};
|
|
720
|
+
} catch {
|
|
721
|
+
return { dimensions: [], metrics: [] };
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
async function runSampleReport(proxyFetch, propertyId, dimensions, metrics, limit) {
|
|
725
|
+
try {
|
|
726
|
+
const res = await proxyFetch(
|
|
727
|
+
`${DATA_BASE_URL}/properties/${propertyId}:runReport`,
|
|
728
|
+
{
|
|
729
|
+
method: "POST",
|
|
730
|
+
headers: { "Content-Type": "application/json" },
|
|
731
|
+
body: JSON.stringify({
|
|
732
|
+
dateRanges: [{ startDate: "28daysAgo", endDate: "today" }],
|
|
733
|
+
dimensions: dimensions.map((name) => ({ name })),
|
|
734
|
+
metrics: metrics.map((name) => ({ name })),
|
|
735
|
+
limit
|
|
736
|
+
})
|
|
737
|
+
}
|
|
738
|
+
);
|
|
739
|
+
if (!res.ok) return [];
|
|
740
|
+
const data = await res.json();
|
|
741
|
+
return data.rows ?? [];
|
|
742
|
+
} catch {
|
|
743
|
+
return [];
|
|
744
|
+
}
|
|
745
|
+
}
|
|
680
746
|
var googleAnalyticsOauthSetupFlow = {
|
|
681
747
|
initialState: () => ({}),
|
|
682
748
|
steps: [
|
|
@@ -760,23 +826,111 @@ var googleAnalyticsOauthSetupFlow = {
|
|
|
760
826
|
sections.push("_No properties selected._", "");
|
|
761
827
|
return sections.join("\n");
|
|
762
828
|
}
|
|
763
|
-
sections.push(
|
|
764
|
-
"| Property ID | Display Name | Time Zone | Currency | Industry |"
|
|
765
|
-
);
|
|
766
|
-
sections.push(
|
|
767
|
-
"|-------------|--------------|-----------|----------|----------|"
|
|
768
|
-
);
|
|
769
829
|
for (const propertyId of targetPropertyIds) {
|
|
770
830
|
const prop = await getProperty(rt.config.proxyFetch, propertyId);
|
|
771
|
-
const displayName =
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
831
|
+
const displayName = prop?.displayName ?? propertyId;
|
|
832
|
+
sections.push(`### Property: ${displayName} (${propertyId})`, "");
|
|
833
|
+
if (prop?.timeZone || prop?.currencyCode || prop?.industryCategory) {
|
|
834
|
+
const details = [];
|
|
835
|
+
if (prop.timeZone) details.push(`Time Zone: ${prop.timeZone}`);
|
|
836
|
+
if (prop.currencyCode) details.push(`Currency: ${prop.currencyCode}`);
|
|
837
|
+
if (prop.industryCategory)
|
|
838
|
+
details.push(`Industry: ${prop.industryCategory}`);
|
|
839
|
+
sections.push(details.join(" | "), "");
|
|
840
|
+
}
|
|
841
|
+
const metadata = await getMetadata(rt.config.proxyFetch, propertyId);
|
|
842
|
+
if (metadata.dimensions.length > 0) {
|
|
843
|
+
const categories = /* @__PURE__ */ new Map();
|
|
844
|
+
for (const d of metadata.dimensions) {
|
|
845
|
+
const cat = d.category || "Other";
|
|
846
|
+
if (!categories.has(cat)) categories.set(cat, []);
|
|
847
|
+
categories.get(cat).push(d.uiName ?? d.apiName ?? "");
|
|
848
|
+
}
|
|
849
|
+
sections.push("#### Available Dimensions", "");
|
|
850
|
+
for (const [cat, dims] of categories) {
|
|
851
|
+
sections.push(
|
|
852
|
+
`- **${cat}**: ${dims.slice(0, 10).join(", ")}${dims.length > 10 ? ` \u2026+${dims.length - 10}` : ""}`
|
|
853
|
+
);
|
|
854
|
+
}
|
|
855
|
+
sections.push("");
|
|
856
|
+
}
|
|
857
|
+
if (metadata.metrics.length > 0) {
|
|
858
|
+
const categories = /* @__PURE__ */ new Map();
|
|
859
|
+
for (const m of metadata.metrics) {
|
|
860
|
+
const cat = m.category || "Other";
|
|
861
|
+
if (!categories.has(cat)) categories.set(cat, []);
|
|
862
|
+
categories.get(cat).push(m.uiName ?? m.apiName ?? "");
|
|
863
|
+
}
|
|
864
|
+
sections.push("#### Available Metrics", "");
|
|
865
|
+
for (const [cat, mets] of categories) {
|
|
866
|
+
sections.push(
|
|
867
|
+
`- **${cat}**: ${mets.slice(0, 10).join(", ")}${mets.length > 10 ? ` \u2026+${mets.length - 10}` : ""}`
|
|
868
|
+
);
|
|
869
|
+
}
|
|
870
|
+
sections.push("");
|
|
871
|
+
}
|
|
872
|
+
const trafficRows = await runSampleReport(
|
|
873
|
+
rt.config.proxyFetch,
|
|
874
|
+
propertyId,
|
|
875
|
+
["date"],
|
|
876
|
+
["sessions", "activeUsers", "screenPageViews"],
|
|
877
|
+
7
|
|
878
|
+
);
|
|
879
|
+
if (trafficRows.length > 0) {
|
|
880
|
+
sections.push("#### Traffic Summary (last 28 days, by date)", "");
|
|
881
|
+
sections.push("| Date | Sessions | Active Users | Page Views |");
|
|
882
|
+
sections.push("|------|----------|-------------|------------|");
|
|
883
|
+
for (const row of trafficRows) {
|
|
884
|
+
const d = row.dimensionValues?.[0]?.value ?? "";
|
|
885
|
+
const s = row.metricValues?.[0]?.value ?? "0";
|
|
886
|
+
const u = row.metricValues?.[1]?.value ?? "0";
|
|
887
|
+
const p = row.metricValues?.[2]?.value ?? "0";
|
|
888
|
+
sections.push(`| ${d} | ${s} | ${u} | ${p} |`);
|
|
889
|
+
}
|
|
890
|
+
sections.push("");
|
|
891
|
+
}
|
|
892
|
+
const channelRows = await runSampleReport(
|
|
893
|
+
rt.config.proxyFetch,
|
|
894
|
+
propertyId,
|
|
895
|
+
["sessionDefaultChannelGroup"],
|
|
896
|
+
["sessions", "activeUsers"],
|
|
897
|
+
10
|
|
777
898
|
);
|
|
899
|
+
if (channelRows.length > 0) {
|
|
900
|
+
sections.push("#### Top Channels (last 28 days)", "");
|
|
901
|
+
sections.push("| Channel | Sessions | Active Users |");
|
|
902
|
+
sections.push("|---------|----------|-------------|");
|
|
903
|
+
for (const row of channelRows) {
|
|
904
|
+
const ch = row.dimensionValues?.[0]?.value ?? "";
|
|
905
|
+
const s = row.metricValues?.[0]?.value ?? "0";
|
|
906
|
+
const u = row.metricValues?.[1]?.value ?? "0";
|
|
907
|
+
sections.push(`| ${ch} | ${s} | ${u} |`);
|
|
908
|
+
}
|
|
909
|
+
sections.push("");
|
|
910
|
+
}
|
|
911
|
+
const pageRows = await runSampleReport(
|
|
912
|
+
rt.config.proxyFetch,
|
|
913
|
+
propertyId,
|
|
914
|
+
["pagePath"],
|
|
915
|
+
["screenPageViews", "activeUsers"],
|
|
916
|
+
10
|
|
917
|
+
);
|
|
918
|
+
if (pageRows.length > 0) {
|
|
919
|
+
sections.push("#### Top Pages (last 28 days)", "");
|
|
920
|
+
sections.push("| Page Path | Page Views | Active Users |");
|
|
921
|
+
sections.push("|-----------|------------|-------------|");
|
|
922
|
+
for (const row of pageRows) {
|
|
923
|
+
const pg = (row.dimensionValues?.[0]?.value ?? "").replace(
|
|
924
|
+
/\|/g,
|
|
925
|
+
"\\|"
|
|
926
|
+
);
|
|
927
|
+
const v = row.metricValues?.[0]?.value ?? "0";
|
|
928
|
+
const u = row.metricValues?.[1]?.value ?? "0";
|
|
929
|
+
sections.push(`| ${pg} | ${v} | ${u} |`);
|
|
930
|
+
}
|
|
931
|
+
sections.push("");
|
|
932
|
+
}
|
|
778
933
|
}
|
|
779
|
-
sections.push("");
|
|
780
934
|
return sections.join("\n");
|
|
781
935
|
}
|
|
782
936
|
};
|
|
@@ -929,9 +1083,9 @@ var googleAnalyticsOauthConnector = new ConnectorPlugin({
|
|
|
929
1083
|
systemPrompt: {
|
|
930
1084
|
en: `### Tools
|
|
931
1085
|
|
|
932
|
-
- \`
|
|
933
|
-
- \`
|
|
934
|
-
- \`
|
|
1086
|
+
- \`connector_google-analytics-oauth_request\`: Send authenticated requests to the GA4 Data API. Use it for running reports, getting metadata, and realtime reports. The {propertyId} placeholder in paths is automatically replaced. Authentication is configured automatically via OAuth.
|
|
1087
|
+
- \`connector_google-analytics-oauth_listAccounts\`: List accessible Google Analytics accounts. Use during setup to discover available accounts.
|
|
1088
|
+
- \`connector_google-analytics-oauth_listProperties\`: List GA4 properties for a given account. Use during setup to select the target property.
|
|
935
1089
|
|
|
936
1090
|
### GA4 Data API Reference
|
|
937
1091
|
|
|
@@ -1001,9 +1155,9 @@ const realtime = await ga.runRealtimeReport({
|
|
|
1001
1155
|
\`\`\``,
|
|
1002
1156
|
ja: `### \u30C4\u30FC\u30EB
|
|
1003
1157
|
|
|
1004
|
-
- \`
|
|
1005
|
-
- \`
|
|
1006
|
-
- \`
|
|
1158
|
+
- \`connector_google-analytics-oauth_request\`: GA4 Data API\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{propertyId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
|
|
1159
|
+
- \`connector_google-analytics-oauth_listAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGoogle Analytics\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
|
|
1160
|
+
- \`connector_google-analytics-oauth_listProperties\`: \u6307\u5B9A\u30A2\u30AB\u30A6\u30F3\u30C8\u306EGA4\u30D7\u30ED\u30D1\u30C6\u30A3\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u30BF\u30FC\u30B2\u30C3\u30C8\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u9078\u629E\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
|
|
1007
1161
|
|
|
1008
1162
|
### GA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
|
|
1009
1163
|
|