Google Script API understanding - javascript

This is a two part question, regarding the Google Script API.
First, I can read the SDK/API reference, and execute examples successfully, via the "try now" feature. But, what I am missing a step in understanding when trying to build webApps (with limited javascript knowledge - admittedly). Namely, the SDK shows the syntax for many things but not in the way I would expect to use it within Javascript.
A concrete example of my problem: I am trying to create a simple function to return verification Codes (8-digit codes) from the Admin API. Here is an example function.
function getCodes(){
var userEmail = 'testuser#exampl.com';
var user = AdminDirectory.Users.list({userKey: userEmail}).verificationCodes;
Logger.log('User data:\n %s', JSON.stringify(user, null, 2));
}
naturally, the syntax for the AdminDirectory call is wrong, I get errors. I have tried many different variation, but without a proper understanding of the reference, I feel like I am just guessing (and I have guessed a lot).
Can someone throw me a bone? Thanks

Have a look at the Users resource
You will see that verificationCodes is not part of this resource
However, there is a way to retrieve verification codes: with VerificationCodes: list
To usew the latter, you need to provide the userEmail as parameter
So modify your request to:
AdminDirectory.VerificationCodes.list(userEmail).items.forEach(function(item){Logger.log('Code: ' + item.verificationCode)});

Related

Image4io and NodeJS: Documentation is clearly outdated. How do I upload an image?

I guess this is as much a call to attention on the fact that the documentation seems to be outright incorrect in its application, as well as just generally lacking. Normally, I would send that part of the message to them personally, but, their contact form is also giving me errors and not sending, so it's not like I have the means to anyway. In the mean time, I'm more worried about getting this code to work, so hopefully someone experienced with this SDK or an Image4io team member sees this and can provide a public answer for others stumbling into this road block.
For starters, I initialized the Image4io object as described in the github here: https://github.com/Image4IO/image4ionodeSDK/
website documentation: https://image4.io/en/documentation/api-sdk/#operation/UploadImage
The image upload example provided on the website's documentation looks like this:
let client=new Image4ioAPI.Image4ioAPI(apiKey,apiSecret);
var request = new Models.UploadImagesRequest("/folderName", true, true);
request.Add("/path/to/image/location/name-of-the-image.jpg", "name-of-the-image", "name-of-the-image.jpg");
let response=client.UploadImage(request);
3 out of the very sparse 4 lines of code they provide give errors. Where did this Models object come from? There is no corresponding class in the import and the code example obviously doesn't show where it was defined. Just what is it and where did it come from?
Well, I found a matching function "UploadImagesRequest" in the original import class, so my guess is Models was deprecated and its functionality was moved into the Image4io class object. If that was the case the solution would be to simply access that function instead... But it's not used the same. It has 4 arguments, the 4th being a "Image4io.UploadFile[]" type. This type has no use examples in the documentation or further details describing what it is exactly. I assume image byte data goes in there somehow, but how?
Finally we have request.Add... except we don't because that isn't a function :( it looks like this was used to actually get the image data (maybe of the type UploadFile?) based on the path of the image. If this function is gone now, how do get file data for use in the upload request function?
Any and all help in figuring out this SDK would be greatly appreciated. Google searches yielded no meaningful results, so hopefully we can help in that department as well. For all I know I just got the wrong version somehow. I guess I could try downgrading to a version that matches the documentation but... that's not a fix in my eyes at all.
Let me know if there's any more info I could provide to help
You can upload image like this:
var client=new Image4ioClient(API_KEY,API_SECRET);
var files=Array();
files.push(new UploadFile("./test.jpg","test.jpg"));
client.UploadImage(new UploadImagesRequest("/",true,false,files))
.then(res=>console.log(res))
If you have binary data at hand, you can write it to a temporary file and then upload them.

How to properly use the sheets.spreadsheets.values.GET in the Google Sheets API?

So I'm a first year programming student with near 0 experience so please forgive me if I'm going at this the wrong way.
I'm building a website that will take an array of strings and display them as well as run some code relating to those strings. For this assignment, I have to use an API, so I wanted to use the google sheets API in order to achieve my idea. I understand that I need to use the command
sheets.spreadsheets.values.GET
to get my spreadsheet data as a JS array, which is perfect for what I want to do. Inside the Google dev console, I am able to test the command and receive my array, so I know that I have the API se t up correctly.
However when I go to my website, which has Jquery linked fyi, and I put in the get command into the console I get the error:
Uncaught SyntaxError: Unexpected identifier
This is weird to me since I'm just copy-pasting from the Dev console into the early version of my website this command:
GET https://sheets.googleapis.com/v4/spreadsheets/MY_Spread_Sheet_ID/values/Sheet1!A1%3AA200?valueRenderOption=FORMATTED_VALUE&key={ApiKeyCode}
I was under the impression that the console should have reported back the contents of my spreadsheet as an array, but instead I get the error.
At first I thought that I must have needed to link the google sheets API to my code like you would with JQuery but I can't find documentation on how to do that, so that might be my problem.
Sorry about my poor English skills.
Could you include your code in your post? FYI, the function spreadsheets.values.get() does not return directly a value, but instead it calls a callback function with the returned values.

Writing to a .json file with node.js filesystem

As seen here: https://anidiots.guide/coding-guides/storing-data-in-a-json-file.html
It shows you how to create a point system in discord.js. But what caught my eye is how they used let points = JSON.parse(fs.readFileSync("./points.json", "utf8"));
to read the file. So i am trying to learn how to make a database where i get the points plus money that can be redeemed daily and shared. kinda like a bank. but i don't know how to do that. If anyone could help me with a hastebin link or anywhere i can learn in depth how to use the JSON.parse(fs.readFileSync("./points.json", "utf8")); thing.
and if you want to see my bot in action don't hesitate to use https://discord.me/knut
The line you're asking about is made of two call to the functions JSON.parse and fs.readFileSync.
JSON.parse. This function receives a bunch of text and transform it (parse it) into a javascript object. It can be very useful when you want to, for example, build something dynamically based on the content of a file. Maybe w3school is a good place to start looking for info about it.
Example
var string = "{id: 4, name:'Volley'}"
var parseObject = JSON.parse(string)
console.log(parseObject.id); //4
console.log(parseObject.name); //Volley
fs.readFileSync. As you probably know, most of the functions in javascript and node.js are asynchronous, that is, instead of calling and get the returned value, you have to define a callback within which you would use the value you want. fs.readFileSync is just the synchronous version of fs.readFile(callback), which returns the content of the read file. Here you have the docs about that function.
These functions are actually simple to use, you should struggle in finding some examples or trying them by yourself.
If you want to imitate what the tutorial said, then you would need to define another file, with the money of each point, or edit the first file if you can, so you could an object like
var point_and_money = {
points : [...],
money : [....]
}
or two objects with the separate information
var points = JSON.parse(fs.readFileSync("./points.json", "utf8"));
var money = JSON.parse(fs.readFileSync("./money.json", "utf8"));
Hope I gave you a hint about what you asked
not really sure what you are trying to achieve?
JSON.parse(fs.readFileSync("./points.json", "utf8"));
This line reads a json file and parse it to a Javascript-Method. Nothing less and nothing more. this can also be done in Nodejs via
var points = require('./points.json');
You mentioned something like how to do a database? Basically I am not sure if you want to develop a database or better use an existing one. Look for MongoDB, SQLLite,IndexedDB, etc. There a tons of database for almost every use case.
Remember that your line of code reads synchronous in a blocking way when the file gets large.
And when multiple users would access the file at the same time you need to handle this somehow. So definitely would suggest to look for some existing database solution and have more time to focus on your business logic.
I hope I understand your question correct and my answer helps.
Maybe this one is also a good question to start: Lightweight Javascript DB for use in Node.js

How do you get a return value in javascript from a Stripes ActionBean?

I am attempting to use Google's Channel API to construct a 2-player game session. I am using a JavaScript function to start opening the channel, and I have a Stripes ActionBean that opens the channel and obtains a new Token for the specific user.
How do I call the ActionBean from JavaScript and get the "String token" from the ActionBean? ${actionBean.token} did not work in the .js file.
PS: I am new to these languages and would appreciate the time and effort invested in answering my question. Thanks !
Edit: Thank you ! I have read the proposed links and I am excited about the JavaScriptResolution. How do I receive the JavaScriptResolution in javascript? Can anyone kindly provide a code snippet perhaps?
Unless you are generating the Javascript in the actionBean that generates the page with the Javascript, the ${actionBean.token} will not work. In that case you need Ajax, you need to make the http request in Javascript. You might want to take a look at this Stripes Ajax example:
Stripes Ajax Example
You might also want to use a JavaScriptResolution to return objects from an actionBean to Javascript, see example code:
Amis JavaScriptResolution Example

Is this a suitable case in which using dynamic function creation would be justified?

I'm currently developing a tutorial site for teaching the fundamentals of Web development (HTML, CSS, and JavaScript, for starters). I'd like a setup where I could give in-depth coverage of all sorts of topics and then provide a basic sandbox environment where the user could write code which solves the question asked at the end of each tutorial section.
For example, if I'd covered multiplication in a previous tutorial, and the user had just finished a lesson on functions being capable of returning values, I might request that they submit a function which returns the product of two parameters.
Is this not the perfect instance in which using dynamic function creation would be considered a good idea? Let's look at an example.
<script>
function check()
{
eval('var f = ' + document.getElementById('user_code').value);
if (f(5, 10) == 50)
{
// user properly wrote a function which
// returned the product of its parameters
}
}
</script>
Is this at all a bad idea? If so, please explain.
This sounds like it could work. However, the biggest challenge in your environment might be error handling. Students will surely make all sorts of errors:
Compile time errors, that will be detected in eval()
Run time errors, that will be detected when you call the function
Undetectable run time errors, such as an infinite loop or a stack overflow
A more elaborate approach might parse the entered Javascript into a parse tree representation, then compare it to an expected parse tree. If it does not match, then point out what might be wrong and have the student try again. If it does match, then you can eval() and call the function, knowing that it will do what you expect.
Implementing a lexer and parser for Javascript in Javascript would be challenging but certainly not impossible.
Should work as long as you're operating this in a closed environment. Eval opens you up to code injection attacks so I wouldn't put this on a publicly accessible web site, but if it's completely contained within your class room you should be ok.
The code would work, but what if there is an error both syntactically or otherwise ? Perhaps use a try block to catch any error and display it to the user would help things a little...
Not sure if this helps.
Sounds like you want to remake Firebug or even the new Developer Tools in IE8. Due to that, I'm going to have to say there is never a useful case. Not to mention the possibilities of script injection if this site goes public.
In your case, I feel that there is nothing wrong with this. Alternatively you can run the code by using new Function() to build stuff first and then run it. In theory, this would separate the stages of "compiling" and executing. However eval will check the code first and throw errors anyway:
var usercode = document.getElementById('user_code').value;
try {
var f = new Function( 'a','b','return (' + usercode + ')(a,b);' );
if ( f( 5, 10 ) ) {
// user properly wrote a function which
// returned the product of its parameters
}
else {
// user wrote code that ran but produced incorrect results
}
}
catch ( ex ) {
// user wrote something really bad
}
The problem with doing things in this manner is that the exceptions thrown may be nonsensical. "foo;;=bar" will report a "missing ) in parenthetical" error while eval will throw a propper syntax error. You could bypass this by (regexp) grabbing the parameters and body from the user code first and then building it. But then, how would this be any better than an eval?
I think that your real problem will be helping users avoid the pitfalls of implicit globals. How are you going to help users avoid writing code that only works the second time it runs because a global was set the first time? Will you not need to implement a clean sandbox every run? I would take a look at how jsbin.com, firebug and similar tools handle these things.
My feeling is that you should go with eval for now and change it for more elaborate stuff later if the need arrises.

Categories

Resources