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..."