{"id":6887,"date":"2026-03-31T15:22:58","date_gmt":"2026-03-31T15:22:58","guid":{"rendered":"https:\/\/obsidiansofteducation.com\/?page_id=6887"},"modified":"2026-04-16T06:13:04","modified_gmt":"2026-04-16T06:13:04","slug":"mit-app-inventor-quiz-app-google-sheets-tutorial","status":"publish","type":"page","link":"https:\/\/obsidiansofteducation.com\/index.php\/mit-app-inventor-quiz-app-google-sheets-tutorial\/","title":{"rendered":"Dynamic Quiz App in MIT App Inventor &#8211; How to get Quiz Questions from Google Sheet"},"content":{"rendered":"\n<p class=\"has-medium-font-size\">Hello friends, and welcome to Obsidian Soft.&nbsp;<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Today, we will make a dynamic quiz app in MIT App Inventor. Most quiz apps are static. If you want to change questions, you have to edit the app again.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">But in this tutorial, I will teach you how to build a quiz app where all questions come from Google Sheets \u2014 and you can update them anytime without touching the app.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"290\" height=\"621\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/Photos_sDOyCcJwV1.png\" alt=\"\" class=\"wp-image-6908\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/Photos_sDOyCcJwV1.png 290w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/Photos_sDOyCcJwV1-140x300.png 140w\" sizes=\"auto, (max-width: 290px) 100vw, 290px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-medium-font-size\">So, let\u2019s begin.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">First of all, open up Google Sheet.&nbsp;<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><a href=\"https:\/\/docs.google.com\/spreadsheets\/u\/0\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.google.com\/spreadsheets\/u\/0<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Choose a blank sheet. Rename it to Quiz Questions.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Create a simple sheet with 5 columns<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Question, Correct Answer, Choice1, Choice2, Choice3, and fill it up similar to the screenshot below:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"976\" height=\"238\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-13.png\" alt=\"\" class=\"wp-image-6944\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-13.png 976w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-13-300x73.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-13-768x187.png 768w\" sizes=\"auto, (max-width: 976px) 100vw, 976px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Remember that you can always add more questions to it later, and you will not have to update your MIT App Inventor code at all. Also, if you want a quiz app that loads questions from an online trivia API, let me know in the comments.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Coming back to the tutorial, look at the top of your Google Sheet. You will see a share button. Click it, and a dialog will appear. Choose \u201cAnyone with the link\u201d in <strong>General Access<\/strong>, and then click the <strong>Copy link<\/strong> button.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"565\" height=\"213\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image.png\" alt=\"\" class=\"wp-image-6888\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image.png 565w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-300x113.png 300w\" sizes=\"auto, (max-width: 565px) 100vw, 565px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Paste the copied link into a text file. It will look something like this:<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1tLlr0ps7-gxNV1-NCTMS4fYvynvUPu8Cxkz8\/edit?usp=sharing\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.google.com\/spreadsheets\/d\/1tLlr0ps7-gxNV1-NCTMS4fYvynvUPu8Cxkz8\/edit?usp=sharing<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Replace <strong>edit?usp=sharing<\/strong> by <strong>export?format=csv<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Make sure that it is exactly this: <strong>export?format=csv<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Try this link. You should get a CSV like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Question,Answer,Choice1,Choice2,Choice3\nWhat is the only food that can never go bad?,Honey,Dark Chocolate,Peanut Butter,Honey\nWhich animal has the largest brain relative to its body size?,Dolphin,Human,Dolphin,Elephant\nWhat is the hardest natural substance on Earth?,Diamond,Diamond,Gold,Iron\nHow many bones are in the adult human body?,206,150,300,206\nWhat is the fastest land mammal on Earth?,Cheetah,Cheetah,Lion,Gazelle<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size\">CSV means comma-separated values. We will decode this in MIT App Inventor, so keep the link safe for later use.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Now, download some sound effects for correct and wrong sound.&nbsp;<\/p>\n\n\n\n<p class=\"has-medium-font-size\">I like these from Pixabay, but you can choose something else, too.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Sound Effects: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-medium-font-size\">https:\/\/pixabay.com\/sound-effects\/search\/wrong\/ <\/li>\n\n\n\n<li class=\"has-medium-font-size\">https:\/\/pixabay.com\/sound-effects\/search\/correct\/<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\">Now open up MIT App Inventor. Start a new project. Let\u2019s call it DynamicQuizApp.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Keep the toolkit default.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Upload the two sound effects to the media.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">In screen1\u2019s properties, make align horizontal and align vertical both centered. Make the background color a custom dark blue color, for example. 0F172A and screen orientation should be portrait.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Add a label from the User Interface palette. Rename to scoreLbl. Make the font bold, font size: 22, text color: green, and then remove all text from it. Select and duplicate it. Rename to messageLbl. Change font size to 18 and change text color to cyan.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Add a vertical arrangement from the layout palette below the messageLbl with properties: align horizontal and align vertical both centered, background color: yellow, height: 30%, and width: 70%. Rename the arrangement to Card.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Put a label inside this&nbsp; Card arrangement and rename it to questionLbl. Make font bold, font size: 18, and text alignment: center.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Below the Card arrangement, put a button. Rename to choiceBtn1. Make the width 50%. In its properties, set the background color to white. Make font: bold, font size: 18, and shape: rounded. Duplicate twice to get choiceBtn2 and choiceBtn3. Duplicate it one more time, but rename this one to restartBtn. Make the background color cyan. Change the width to automatic and change the text to Restart.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Add some empty labels between the buttons for spacing.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Add a sound component from the Media palette. Rename to correctSound and choose the uploaded correct sound effect as the source. Duplicate and rename to wrongSound and change its source to the wrong sound effect.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Last but not least, add a web component from the connectivity palette. In its properties, set the URL to the one that you got from the Google Sheet and edited in a text file.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Our UX design is done, so let\u2019s go to the block section.<\/p>\n\n\n\n<p class=\"has-medium-font-size\">First, we will make some global variables. We need a score and a current questionNumber both initialized to 0.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"444\" height=\"52\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-2.png\" alt=\"\" class=\"wp-image-6890\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-2.png 444w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-2-300x35.png 300w\" sizes=\"auto, (max-width: 444px) 100vw, 444px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"586\" height=\"52\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-1.png\" alt=\"\" class=\"wp-image-6889\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-1.png 586w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-1-300x27.png 300w\" sizes=\"auto, (max-width: 586px) 100vw, 586px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">We need a global list to contain our quiz questions, answers, and answer choices.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"722\" height=\"54\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-3.png\" alt=\"\" class=\"wp-image-6891\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-3.png 722w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-3-300x22.png 300w\" sizes=\"auto, (max-width: 722px) 100vw, 722px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Let\u2019s quickly make a shuffle procedure for shuffling our list. I have taught exactly the same thing in my flash cards app too. You can use it to shuffle any list.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"248\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-4.png\" alt=\"\" class=\"wp-image-6892\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-4.png 800w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-4-300x93.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-4-768x238.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">I need a helper procedure for hiding and showing my choice buttons and card depending on whether I pass true or false in status:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"810\" height=\"288\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-5.png\" alt=\"\" class=\"wp-image-6893\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-5.png 810w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-5-300x107.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-5-768x273.png 768w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Make an empty procedure for clearing up the screen for restarting and call it restart and also make an empty procedure for showing the next Question. We will work on them later.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"224\" height=\"122\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-6.png\" alt=\"\" class=\"wp-image-6894\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"386\" height=\"122\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-7.png\" alt=\"\" class=\"wp-image-6895\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-7.png 386w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-7-300x95.png 300w\" sizes=\"auto, (max-width: 386px) 100vw, 386px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Next, get the screen1 initialize event and call restart in it, and also Web1.Get. This will use the URL that we set up for the Web component in the designer view and try to get results from the Google Sheet.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"416\" height=\"182\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-8.png\" alt=\"\" class=\"wp-image-6896\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-8.png 416w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-8-300x131.png 300w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Next, using an if\/else block from control, check that the response content is not empty i.e., some data was returned from the sheet. Otherwise, we use the messageLbl to show an appropriate message to the user.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"277\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-9-1024x277.png\" alt=\"\" class=\"wp-image-6897\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-9-1024x277.png 1024w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-9-300x81.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-9-768x208.png 768w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-9.png 1292w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">In if condition, once we know that the responseContent is not empty, we use the \u201clist from csv table\u201d block from the Lists section to convert our comma-separated values (csv) responseContent into a list. This conversion will return a list of lists.&nbsp; Why a list of lists? We will get a list where each item is also a list containing 5 items: question, answer, choice1, choice2, and choice3.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"319\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-10-1024x319.png\" alt=\"\" class=\"wp-image-6898\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-10-1024x319.png 1024w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-10-300x93.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-10-768x239.png 768w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-10-1536x478.png 1536w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-10.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Now, we don\u2019t want the first item as it contains column headers, so we will remove it. Then, we make sure that our choice buttons and card are showing by calling our custom procedure showChoiceButtonsAndCard with a true value. We also use our shuffle procedure to shuffle the quizList, and then we call the showNextQuestion procedure.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"637\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-11-1024x637.png\" alt=\"\" class=\"wp-image-6899\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-11-1024x637.png 1024w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-11-300x187.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-11-768x478.png 768w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-11.png 1292w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Next, we will work on the showNextQuestion procedure that we had left empty earlier. First, we add a 1 to our questionNumber. And then we check that we still have questions left in our quiz. How can we know that? We can check that questionNumber is still less than or equal to the length of the quizList (number of questions in our quiz). If not, we go in the else condition where we will clean up questionLbl and messageLbl and hide the card and choice buttons so that only score and restart buttons are visible.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"382\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-12-1024x382.png\" alt=\"\" class=\"wp-image-6900\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-12-1024x382.png 1024w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-12-300x112.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-12-768x287.png 768w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-12.png 1420w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">So, what happens in the if condition of the showNextQuestion procedure? We have to set the text of questionLbl and our choice buttons, so do it carefully. The quizList is a list of lists, as explained earlier. We need to get a particular list from this list of lists; the one at the index questionNumber, as that is the question we are showing at the moment. For example, when the quiz is started, questionNumber becomes 1 from 0, so we get the first question\u2019s data, i.e., the list from quizList. Now, the 1<sup>st<\/sup> item in this list is the question\u2019s text, the 2<sup>nd<\/sup> item is the answer, but we don\u2019t need it at the moment, the 3<sup>rd<\/sup> item is choice1, the 4<sup>th<\/sup> item is choice2, and the 5<sup>th<\/sup> item is choice3. So, update questionLbl and appropriate choice buttons.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"860\" height=\"358\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-13.png\" alt=\"\" class=\"wp-image-6901\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-13.png 860w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-13-300x125.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-13-768x320.png 768w\" sizes=\"auto, (max-width: 860px) 100vw, 860px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Hence, our final showNextQuestion procedure looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"672\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-15-1024x672.png\" alt=\"\" class=\"wp-image-6903\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-15-1024x672.png 1024w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-15-300x197.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-15-768x504.png 768w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-15-1536x1008.png 1536w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-15.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Then, let\u2019s work on the custom restart procedure, which is simply cleaning up code. We enable the card and choice buttons. Reset score and questionNumber back to 0. Reset the labels on the screen. Shuffle the quizList and restart the quiz by calling the showNextQuestion procedure.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"654\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-14.png\" alt=\"\" class=\"wp-image-6902\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-14.png 1024w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-14-300x192.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-14-768x491.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Now, make a procedure for checkAnswer which takes in an input that you can rename to chosenAnswer.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"556\" height=\"122\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-16.png\" alt=\"\" class=\"wp-image-6904\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-16.png 556w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-16-300x66.png 300w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Inside it, choose an if\/else block from control to check that the chosenAnswer is equal to 2<sup>nd<\/sup> item in your list at index=questionNumber in your master quizList. If yes, play the correct sound, increase the score by 1, update scoreLbl, and set messageLbl to \u201cCorrect!\u201d. Otherwise, play the wrong sound and set messageLbl to \u201cWrong!\u201d After the if\/else block ends, call the showNextQuestion procedure to show the next question.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"440\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-14-1024x440.png\" alt=\"\" class=\"wp-image-6946\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-14-1024x440.png 1024w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-14-300x129.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-14-768x330.png 768w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-14-1536x660.png 1536w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/04\/image-14.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Now, from any component section, get any button click event that is inside the Any Button blocks.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"195\" height=\"285\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-17.png\" alt=\"\" class=\"wp-image-6905\"\/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Inside this click event, use the if\/else block from control to check if the button is resetBtn or not. If true, then call the restart procedure; else, call the custom procedure checkAnswer, but pass it the text on the clicked button.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"453\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-18-1024x453.png\" alt=\"\" class=\"wp-image-6906\" srcset=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-18-1024x453.png 1024w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-18-300x133.png 300w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-18-768x340.png 768w, https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2026\/03\/image-18.png 1048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Our app is done. You can try it now. I hope you liked this simple and beginner-friendly dynamic quiz app along with sound effects. <\/p>\n\n\n\n<p class=\"has-medium-font-size\">You can also have a look at the video tutorial here:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<p class=\"responsive-video-wrap clr\"><iframe loading=\"lazy\" title=\"Build a Quiz App with Live Google Sheets Questions - No Coding! - Full Tutorial\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/qAYzCvmZw0I?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<\/div><\/figure>\n\n\n\n<p class=\"has-medium-font-size\">Please like my videos and share it with your friends and family. Also, subscribe to my channel and press the bell icon so you don\u2019t miss any of the great projects I have planned for you.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><a href=\"https:\/\/www.youtube.com\/c\/obsidiansofteducation\" target=\"_blank\" rel=\"noopener\">https:\/\/www.youtube.com\/c\/obsidiansofteducation<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Please like my Facebook page and Instagram page for more educational resources and tips.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Facebook:<\/strong><a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/7140650632339107612#\" target=\"_blank\" rel=\"noopener\">&nbsp;https:\/\/www.facebook.com\/ObsidianSoft\/<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Instagram:<\/strong><a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/7140650632339107612#\" target=\"_blank\" rel=\"noopener\">&nbsp;https:\/\/www.instagram.com\/obsidiansoftapps\/<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Pinterest:<\/strong>&nbsp;<a href=\"https:\/\/www.pinterest.com\/obsidiansoft\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.pinterest.com\/obsidiansoft\/<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\">For links to free educational&nbsp;<a href=\"https:\/\/obsidiansofteducation.com\/index.php\/flappy-bird-game-mit-app-inventor\/#\">&nbsp;apps<\/a>, have a look at the&nbsp;<a href=\"https:\/\/obsidiansofteducation.com\/index.php\/mobile-apps\/\">educational apps page<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello friends, and welcome to Obsidian Soft.&nbsp; Today, we will make a dynamic quiz app in MIT App Inventor. Most quiz apps are static. If you want to change questions, you have to edit the app again. But in this tutorial, I will teach you how to build a quiz app where all questions come [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6907,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6887","page","type-page","status-publish","has-post-thumbnail","hentry","entry","has-media"],"_links":{"self":[{"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/6887","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/comments?post=6887"}],"version-history":[{"count":4,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/6887\/revisions"}],"predecessor-version":[{"id":6949,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/6887\/revisions\/6949"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/media\/6907"}],"wp:attachment":[{"href":"https:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/media?parent=6887"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}