The Community will be temporarily unavailable starting on Friday February 28. We’ll be back as soon as we can! To learn more, check out our Announcements blog post.
Oct 28, 2024 01:52 AM
Goal: importing JSON from an open API into my airtable base.
How: Using a script extension in the base (at the bottom of this message), with proper error logging.
Result: No return after “let response;” The script just seems to stop without any error triggering. The last log is “console.log("⏳ Start fetching domeinen data...")”
Test that does work: A curl request to the API does yield the complete JSON, just as a request through postman. So the API is reachable.
The code to request and import the data:
// API credentials
let apiKey = "(API key censored, but it's working)";
let apiUrl = "https://opendata.slo.nl/curriculum/api/v1/domein/";
// Function to fetch the domeinen data
async function fetchDomeinen() {
console.log("⏳ Start fetching domeinen data...");
let response;
try {
response = await fetch(apiUrl, {
method: "GET",
headers: {
"Accept": "application/json",
"Authorization": "Basic " + btoa("key:" + apiKey) // Basic Auth with API key
}
});
console.log("Response received:", response); // Log the full response object for debugging
if (!response.ok) {
console.error(`❌ API request failed with status: ${response.status}, ${response.statusText}`);
return null;
}
console.log(`✅ API request completed. Status code: ${response.status}`);
} catch (error) {
console.error("❌ Error during fetch:", error);
return null;
}
// Check if response contains data
try {
let data = await response.json();
if (!data || data.length === 0) {
console.error("⚠️ No data found in API response.");
return null;
}
console.log("✅ Successfully fetched domeinen data:", data);
return data; // Return the domeinen data
} catch (error) {
console.error("❌ Error parsing JSON:", error);
return null;
}
}
// Function to update Airtable with domeinen data
async function updateTableWithDomeinen() {
console.log("⏳ Fetching domeinen...");
// Fetch domeinen data
let domeinen = await fetchDomeinen();
if (!domeinen) {
console.log("❌ No domeinen data found. Exiting...");
return;
}
// Check if the table "Domeinen" exists
let domeinenTable;
try {
domeinenTable = base.getTable("Domeinen");
console.log("✅ Domeinen table found.");
} catch (error) {
console.error("❌ Error: Domeinen table not found in Airtable. Please check table name.", error);
return;
}
console.log("⏳ Starting to insert domeinen data into Airtable...");
// Loop through each domein and create a record in Airtable
for (let domein of domeinen) {
// Check if the essential fields are present in the domein object
if (!domein.uuid || !domein.titel) {
console.error(`❌ Domein missing required fields (UUID or Title). Skipping domein:`, domein);
continue;
}
console.log(`⏳ Inserting domein: UUID = ${domein.uuid}, Title = ${domein.titel}`);
try {
await domeinenTable.createRecordAsync({
"UUID": domein.uuid || "No UUID",
"Naam": domein.titel || "No Title",
"Omschrijving": domein.omschrijving || "No Description",
"Type domein": domein.type || "No Type", // Adjust according to API response
"Release datum": domein.releaseDate ? new Date(domein.releaseDate) : null, // Optional
"URL": `https://opendata.slo.nl/curriculum/uuid/${domein.uuid}`
});
console.log(`✅ Successfully inserted domein: ${domein.uuid}`);
} catch (error) {
console.error(`❌ Error inserting domein: ${domein.uuid}`, error);
}
}
console.log("✅ Finished inserting all domeinen.");
}
// Run the script to update Airtable
updateTableWithDomeinen();
Solved! Go to Solution.
Oct 28, 2024 03:14 PM
Oct 28, 2024 03:14 PM
Hi,
try to run it with last line
await updateTableWithDomeinen();
Oct 29, 2024 07:04 AM
Thanks! This works and the script continues and logs an actual error. Now I can find the next issue, which might be unrelated:
console.log
"⏳ Fetching domeinen..."
console.log
"⏳ Start fetching domeinen data..."
console.log
"Response received:"
{}
console.error
"❌ API request failed with status: 401, Unauthorized"
console.log
"❌ No domeinen data found. Exiting..."