Feb 08, 2021 03:57 PM
I’m trying to adapt the code by @Bill.French used here to upload a single long text field’s contents as a markdown document to Dropbox.
The automation is:
Trigger: When a new record is created
(records are created with nearly all fields filled at once, using Zapier, so the inputConfig fields are never empty)
Action: Run script…
// set the table name
let table = "Piece Information";
let inputConfig = input.config();
let fileContents = inputConfig.showNotes;
let fileName = inputConfig.fileID + "_" + inputConfig.fileName;
let fileNameExt = inputConfig.fileID + "_" + inputConfig.fileName + ".md";
// set the endpoint and app token
let dropboxEndpoint = "https://content.dropboxapi.com/2/files/upload";
let appToken = "<my app token>";
// set up the post options
let postOptions = {
method: "post",
headers: {
"Authorization" : "Bearer " + appToken,
"Dropbox-API-Arg" : "{\"path\": \"2021%20TC-RHDF%20Competition/ALL%20ENTRIES/"+fileNameExt+"\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}",
"Content-Type" : "application/octet-stream",
"Accept" : "application/json",
},
body: fileContents
}
const postResults = await fetch(dropboxEndpoint, postOptions);
const jsonPost = await postResults.json();
// display the dropbox upload result
output.markdown("Display Drop[box Response JSON Object");
output.inspect(jsonPost);
When I remove this section, I get no errors, but I don’t see a file uploaded in dropbox:
const postResults = await fetch(dropboxEndpoint, postOptions);
const jsonPost = await postResults.json();
// display the dropbox upload result
output.markdown("Display Drop[box Response JSON Object");
output.inspect(jsonPost);
When I keep that section, I see this error:
SyntaxError: Unexpected token E in JSON at position 0 at main on line 40
Line 40 corresponds to: const jsonPost = await postResults.json();
Any sense what’s going wrong here?
I’m new to JavaScript and know almost nothing about JSON. I also have Zapier, on the off chance anyone knows an easier way to do this using Zapier (but it seems like the only dropbox options there are to upload a file with a .txt extension, and I need it to be a markdown file).
The reason for all of this is that I have a dropbox folder set up using JustCast to create a podcast RSS feed. Each audio file in that folder creates a podcast episode. Each audio file in that folder has a corresponding record in Airtable, with a “Summary” rich text field. Any markdown file placed into that folder with a matching file name to the audio file automatically becomes the Show Notes for the podcast episode.
Thanks for your help!!
Solved! Go to Solution.
Feb 11, 2021 11:15 AM
Solved! The main issue was that I forgot to add the “/” before the file path. And none of the file path should be encoded. It’s working great now, many thanks!
Here’s the final script:
// set the table name
let table = "Piece Information";
// identify the field to be exported
let inputConfig = input.config();
let fileContents = inputConfig.showNotes;
let fileName = inputConfig.fileID + "_" + inputConfig.fileName;
let fileNameExt = inputConfig.fileID + "_" + inputConfig.fileName + ".md";
//display the contents of the file
//output.inspect(fileContents);
//
// write the file to a cloud drive service
//
// set the endpoint and app token
let dropboxEndpoint = "https://content.dropboxapi.com/2/files/upload";
let appToken = "<my app token>";
// set up the post options
let postOptions = {
method: "post",
headers: {
"Authorization" : "Bearer " + appToken,
"Dropbox-API-Arg" : "{\"path\": \"/2021 TC-RHDF Competition/ALL ENTRIES/"+ fileName +"/"+fileNameExt+"\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}",
"Content-Type" : "application/octet-stream",
"Accept" : "application/json",
},
body: fileContents
}
const postResults = await fetch(dropboxEndpoint, postOptions);
const jsonPost = await postResults.text();
Feb 08, 2021 04:17 PM
Hi @Isabel_Vazquez and welcome to the community!
Yes, at that point it’s trying to parse what is expected to be a JSON object and it isn’t able to parse it. For debugging purposes, try changing it to:
const jsonPost = await postResults.text();
This will help you see what’s being sent in the response to the API call.
Feb 11, 2021 10:35 AM
Hi @Bill.French ! Thanks so much. I’ve been a lurker for a while, but noticed how active and helpful people are, so I thought I’d join the fun :slightly_smiling_face:
Setting aside for a moment that I’m getting the error message that neither ‘output.markdown’ nor ‘output.inspect’ are functions…
For debugging right now, I’m just running console.log(jsonPost) and I’m now seeing this error message:
"Error in call to API function "files/upload": HTTP header "Dropbox-API-Arg": path: '2021%20TC-RHDF%20Competition/ALL%20ENTRIES/6018C_You, Me and Pikachu.md' did not match pattern '(/(.|[\r\n])*)|(ns:[0-9]+(/.*)?)|(id:.*)'"
I thought the problem might be the filename not being encoded, but even when I adapted this line:
"Dropbox-API-Arg" : "{\"path\": \"2021%20TC-RHDF%20Competition/ALL%20ENTRIES/"+encodeURI(fileNameExt)+"\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}",
I see the same error:
"Error in call to API function "files/upload": HTTP header "Dropbox-API-Arg": path: '2021%20TC-RHDF%20Competition/ALL%20ENTRIES/6018C_You,%20Me%20and%20Pikachu.md' did not match pattern '(/(.|[\r\n])*)|(ns:[0-9]+(/.*)?)|(id:.*)'"
Feb 11, 2021 11:15 AM
Solved! The main issue was that I forgot to add the “/” before the file path. And none of the file path should be encoded. It’s working great now, many thanks!
Here’s the final script:
// set the table name
let table = "Piece Information";
// identify the field to be exported
let inputConfig = input.config();
let fileContents = inputConfig.showNotes;
let fileName = inputConfig.fileID + "_" + inputConfig.fileName;
let fileNameExt = inputConfig.fileID + "_" + inputConfig.fileName + ".md";
//display the contents of the file
//output.inspect(fileContents);
//
// write the file to a cloud drive service
//
// set the endpoint and app token
let dropboxEndpoint = "https://content.dropboxapi.com/2/files/upload";
let appToken = "<my app token>";
// set up the post options
let postOptions = {
method: "post",
headers: {
"Authorization" : "Bearer " + appToken,
"Dropbox-API-Arg" : "{\"path\": \"/2021 TC-RHDF Competition/ALL ENTRIES/"+ fileName +"/"+fileNameExt+"\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}",
"Content-Type" : "application/octet-stream",
"Accept" : "application/json",
},
body: fileContents
}
const postResults = await fetch(dropboxEndpoint, postOptions);
const jsonPost = await postResults.text();
Feb 11, 2021 11:28 AM
Yep - apologies for this - I wasn’t fully on board with your question in the actions script despite you clearly indicating such. :winking_face:
Typically, I do not debug in actions so my code is rife with references to UI components.
Feb 11, 2021 11:32 AM
No worries at all! I’m so new at this stuff, I’m not great at catching things that shouldn’t be there in different contexts.
Thanks for your help!