Backup Your PC and Work With Your Files Using Google Backup and Sync and Google Drive File Stream

Google Drive is a great tool.  It allows us to collaborate, share, and store our files “in the cloud”.  It has completely changed the way I manage my files.  One of the huge benefits of Google Drive is that you can leverage it to store backups of your important files.  Until recently, that was done with the Google Drive Sync application.  The old Google Drive Sync was a powerful tool, but it had some downsides.

  1. It would pull down local copies of everything in your Google Drive.  While having things in two places is a good strategy, I have hundreds of gigabytes of data that I keep in my Drive that I don’t need on a daily basis.  Keeping a copy of this data on local storage was a waste.  You could specify in the client which folders to sync, but as soon as you stopped syncing all folders, folders you created moving forward required you to remember to go into the client and check a box to sync them.
  2. Folders where important files are commonly located on your computer (like your documents, desktop, and pictures) were not synced by default.  You could get around this by moving the target of these folders to a subfolder in your Google Drive, but this process was not intuitive for the average user and always felt like you were tricking Google Drive to sync your stuff.

Fortunately, these problems have been solved using two new(ish) tools from Google.

  1. Backup and Sync – this product is the replacement for the old Google Drive Sync application discussed above.  It separates the “backup” function from the “sync” function.  What most end users really need is the “backup” function.  Most of us can skip the “sync” function because of….
  2. Google Drive File Stream – this product will map a network drive (just like a file share on a server) that represents to your Google Drive.  This allows you easy access to all your files in Drive, without creating a local copy.  The files are navigated and opened  through your file system (just like your other local files).  For example, let’s say you have a native Photoshop file stored in Google Drive.  You can locate that file through the mapped drive that represents your Google Drive, then open it directly in Photoshop.  The file is streamed for use on your computer.  You make your changes, save the file, and those changes are saved directly to the file in your Drive.  No downloading, no uploading, no syncing.  The interaction with Google Drive is almost completely transparent to the user.  You can even access files stored in your Team Drives this way!

With these two applications, you can easily backup the important files on your computer and access all your important files “in the cloud”.  In the video above, I’ll show you how I set these programs using a PC, but there are also Mac clients available.  I’ve provided links to the installers from the video below.

Note: It is important to note that Google Drive File Stream only works with “G Suite” accounts (Like Google Apps for Education or Google Apps for Work).  Google Drive File Stream does not work with individual Google accounts at the time of this article.


If you have any questions about these products, please leave me a comment below.

Getting Your Pictures and Videos From Your Phone or Tablet Into Google Drive

A quick tutorial I created showing methods for uploading pictures and videos to Google Drive from mobile devices. Uploading via a Chromebook using a USB cable to connect your mobile device is shown, as well as uploading using just the mobile device via the Google Drive Android and iOS apps.

Managing Loaner Chromebooks Using Google



My organization is currently preparing for a 1:1 Chromebook implementation.  One of the services we plan to offer is to have a help desk which students and staff can use to support their devices.  We intend to have a stable of loaner devices that students can borrow if their device is broken, uncharged, or forgotten.  We need to have some way to track these devices.  I decided that I would make a solution myself.  This solution had to be:

  • Paperless – It is hard for me to advocate for paperless solutions if I’m not doing so myself (and who wants to deal with all that paper).
  • Efficient – Students need to be able to acquire and return these devices and efficiently as possible so they can get back to what they are here for, learning.
  • Automated – The less interaction with the system anyone needs to have, the better.
  • Google based – We are a G Suite for Education organization, so the solution should be based on Google’s suite of tools.

With these tenets in mind, I wanted to create a system with the following functionality:

  • Reporting – Overuse of the system will be treated as a discipline issue, so the people who will enforce that discipline should receive automated reports on who is using the system too often.
  • Breakage – We use a separate help desk ticketing system.  If we are giving out a loaner due to breakage, a ticket should be created in that system automatically as to not require duplicate entry of information in multiple systems.
  • Receipts – Students should receive electronic receipts when receiving and returning a loaner.
  • Status – Help desk staff should be able to look in one place to find a list of all loaners, their current availability, who has them if they are out, etc.
  • Logging – All events should be logged and errors that need attention should be sent to a defined administrator of the system automatically.

So I set out to create this system using the following tools:

  • Google Forms – I decided to go with two separate forms. I did this to avoid having to ask on the form if the activity was a check-in or a checkout because it would lengthen the process for the ‘customer’ and likely produce a greater number of errors.  One form for the checkouts that would collect the student’s ID number (barcode scan), an identifier for the device being loaned (barcode scan) and a reason for the loan (forgot device, device not charged, broken device).  The other form would be for the check-ins.  Since I would have all the information about the original loan (from the students original checkout), all I should need to collect on the check-in form is the identifier for the device being returned.
  • Google Sheets – Sheets would be the ‘database’ (cough, cough) to house all the required information.  Student information (exported from our student information system), device information (exported from our asset management system), loaner device status, usage history, logging, etc.
  • Google Apps Script – Apps Script would allow me to do all the processing that needs to happen.  Logging activity, sending emails, changing statuses, looking up student and device info, etc.  95% of the work to get this running would be in Google Apps Script.

First the Forms…

  • checkout1Checkout form – This form has 3 questions (in section 1).
    1. What is the student’s ID Number? – We need a key field to look up the students information in the ‘Students’ sheet.  I’m using their student ID for that because our student IDs have barcodes on them and scanning that barcode is the most efficient way to identify the student.  I’ve added data validation to make sure what is scanned ‘looks like’ an ID number (at our organization it is 6 digit numeric).  I did so with the regular expression ‘^[0-9]{6,6}$’.
    2. Which chromebook is being loaned? – We know who is being a loaned a device, but which device are they being loaned?  Again we need a key field to identify the device on the ‘AllDevices’ sheet.   I chose serial number because it is both unique and scannable (barcode).  On our Dell Chromebooks, serial numbers are 6 digit alphanumeric, so I used data validation on the form with the regular expression ‘^[A-Z0-9]{6,6}$’.
    3. checkout2Why is the loaner needed? – We know who, we know which, now we need to know why.  I’m using the ‘go to section based on answer‘ function here.  If the user is borrowing a device because they forgot their device or their device isn’t charged, I don’t need any additional information and the form can be submitted.  If there is breakage however, I’m going to need more details so that we can supply that information to the helpdesk ticketing system.  If ‘broken’ is selected here, the form will be directed to a second section where the broken device’s serial, the category (keyboard, LCD, wireless), and a paragraph field to collect a short description of the problem can be collected.


  • Check-in form – This form has one question – “Which chromebook is being returned?”.  Again, because we know the details of who borrowed the device and why they did from their previous checkout, we can minimize the check-in process to this one question and let the script do the rest.  This form also uses the same data validation (regular expression, ‘^[A-Z0-9]{6,6}$’) to verify that the barcode being scanned is a valid serial number (or at least appears to be).

Now the Spreadhsheet…

The Google Spreadsheet contains sever sheets as follows:

  • AllDevices – This sheet contains all of the loaner devices.  Columns A-D should be populated with device details, one device per row.  Column E should be initially set to “Y” in each device row (to indicate the device is available, and column “F” should be populated with a 0 (zero) in each row, indicating it has not yet been checked out.  Columns E and F will then update as the devices are checked in and out (along with the remainder of the columns).
  • Checkins – This sheet is the destination for the Check-in form.  Data populated on this sheet as the system is used is pulled off to modify on the other Sheets as the functions run, but is ignored after that.
  • Checkouts – Same as above, only for the checkout form.
  • Students – This is a list of potential “customers” of the loaner system.  This data would likely come from an export from your student information system.  Columns A-D contain student information (populated by you) and columns E and F should be populated with zeroes.  E and F will increment as the system is used.  Column F will return to zeroes when the emailWeeklyReport() function runs, column E is cumulative and would need to be manually reset if you needed to reset your all time use counters.
  • StudentIndex – This sheet wasn’t part of my original plan, but became necessary as I moved beyond test data.  In testing, I was only looping through 10 student rows of data.  Performance was quick.  Once I populated the Students sheet with over 1600 students, searching row by row for an ID number match was just too slow.  I added this sheet to determine a subset of rows to search on the Students sheet instead.  This sheet is populated (automatically) by the indexStudentSheet() function described below.
  • Log – Each checkout and check-in are logged here.  You can use this sheet to get metrics from the system.  Errors (which are reported to the admin via email) are also recorded in the log and marked in red.
  • Totals – If a checkout occurs, the current date will be populated (automatically) in Column A if it isn’t already there. Column B will record the numbers of loaners for each date in column A.  I created this sheet to monitor day to day volume usage.

And Finally, the Scripts…

I’ve tried to comment the code as best I could, so if you are re-using this system (please feel free) you should be able to follow along.  This code could definitely be shrunk down to eliminate some redundancy (if I fix that later I’ll update this post).  I’ll highlight the top-level functions below.

  • setGlobals() – I’m using script properties to store the variables that another user might change if implementing this system.  This includes email addresses and thresholds, and is called when the forms are submitted.  It is really there to prevent another implementer from having to scrape the code to change variables.  This function is automatically called any time a form is submitted.
  • onFormSubmit() – This is the bulk of the functionality.  This function runs any time either of the forms are submitted.  It determines if the form submitted is a check-in or a checkout, updates the device sheet, logs the activity, etc.
  • emailWeeklyReport() – This function creates an email containing a list of users (students) who have used loaners X number of times that week, along with a Y long list list of users who have used loaners more than Z times per year.  These thresholds and the email address(es) to send the message to are defined in the setGlobals() function.
  • emailHelpdesk() – If a loner is distributed due to breakage, the details of that breakage are collected on the form.  Our help desk ticketing system allows for email ticket creation, so in that scenario, the details of the breakage are emailed to the help desk system, and a ticket is automatically created using this function.
  • emailAdmin() – There are going to be errors with the system, and this function reports those errors to a designated system administrator (via email).  A student may check out a device whose ID number isn’t found in the student table, a device could be returned that wasn’t listed as being loaned out, etc.  I’ve tried to handle any errors I could think of.
  • emailReceipt() – This function is called once a check-in or checkout is processed successfully.  It provides the end user (the student) a receipt for their usage of the system.
  • indexStudentSheet() – This function sorts the data in the Students sheet by ID number (ascending) and then indexes every X number of rows.  X can be determined manually by setting the useManualIndexDivisor global to ‘TRUE’ and definining your own value for manualIndexDivisor.  If useManualIndexDivisor is ‘FALSE’, this function will automatically determine this value based on the number of student rows.   Those ID numbers and their row numbers are stored on the StudentIndex sheet.  This data is used to determine the range of rows on the Students sheet that will be searched when looking up a student (for performance reasons).

Other Details

There are a couple scenarios I want to be proactive on avoiding.

  • Unauthorized usage – Because Google Forms can only be locked down to the organizational level, I can’t control who in the organization can fill out the form.  It is unlikely that this form would be used by anyone else, but I should do my best to protect the integrity of its use.
  • People manually interacting with the spreadsheet – Since just about everything is automated, really all anyone needs to have to monitor the system is read access to the spreadsheet.  Ideally, I want to make it difficult for even myself to edit anything so that mistakes are minimized.

I can take care of both of these issues by using service accounts.  Service accounts are accounts that a created for a particular function, and are generally unused otherwise.  By making a service account the ‘owner’ of the spreadsheet, scripts, and forms involved, the files involved couldn’t be modified (or more importantly deleted) inadvertently by the administrator (myself in this case).  I’ll create a service account, transfer the ownership of the folder, then give anyone who needs to see the spreadsheet (help desk staff) read only access.  If I need to edit anything, I’ll have to take an extra step to log into that service account to make a change.

I’ve also created a service account to fill out the form.  On the machine we will use to run the check-in and checkout form at the helpdesk, I’ll log into this service account.  Then in the scripts, I’ve made it possible to ignore any submittals that come from anyone but the service account.  Use of this feature is defined by ‘auseAuth’ and ‘authEmail’ in the setGlobals function, and is off by default.  If enabled, and an account other than the one defined by authEmail tries to fill out the form, their submission will be ignored, and the admin will be notified.

What to Do If You Want to Implement This

You will find a public share of the the 2 Google forms and the Google Spreadsheet (containing the scripts) here.  You’ll need to sign into a Google account to make copies for your use.  Below you’ll find a detailed procedure for getting a working implementation set up for your organization.

  1. 1After opening the link above, make copies of the 3 files. They should automatically go into the root of your Google Drive.
  2. In my testing, I get two copies of each form.  I’m not really sure why this is.  You’ll need to determine which two are correct, then delete the other two.
    1. Open up both of the check-in forms, then select the “RESPONSES” tab.  Mouse over the Google Sheets icon.  If it says2a “Create Spreadsheet”, this is not the linked form.  You can delete this form from your Drive by clicking the 3 ellipses in the top right corner, then clicking “Move to trash”.  Look at the other one now.  Go to the responses tab and mouse over the Google Sheets icon again.  It should say “View responses in Sheets”.  This is the correct Google Form.  You can close it for now.
    2. Repeat the same process for the checkout form.3
  3. You should now have the three necessary items in your Drive.  I recommend putting them in one folder for organizational purposes.
  4. Open your copy of the spreadsheet and go to the ‘Students’ sheet.  Change all the emails in column D to your email address so that you’ll be the recipient for any emails the system generates when you are testing.
  5. From the Tools menu, select Script editor... The script should open in a new tab.  In the setGlobals function (about rows 10-40), set all of the email variables to your email address (for testing purposes) and save the code (File > Save)
  6. Click the Select Function but6ton, then select “setGlobals”.  Click the play icon at left to run the function (shown at right).
  7. You should be prompted with an “Authorization required” dialog.  Click Review Permissions.  Review the required permissions, then click Allow (as seen below).
  8. 8Now you’ll need to create the initial indexing of the ‘Student’ sheet.  Select the “indexStudentSheet” function from the list of functions, then hit the play button to run the function.  Take a look at the ‘StudentIndex’ sheet on your spreadsheet.  It should now look like the image at right.
  9. 9Now that the script is authorized and the initial index is built, we’ll need to setup triggers.  From the script tab, click Resources in the menu, then Current project’s triggers.  The dialog box should say “No triggers set up.  Click here to add one now”.  Click that.
  10. Set “Run” to “onFormSubmit”, and “Events” to “From spreadsheet”, “On form submit”.  This is telling the script to run the onFormSubmit function in the script whenever someone fills out the forms.10-12
  11. Click Add a new trigger.  Set “Run” to “emailWeeklyReport”, and “Events” to “Time-driven” and “Week timer”.  Then select the day and time you want your system usage report to go out (see emailWeeklyReport() in the functions section above for more info).  See above for an image of what your triggers should look like.
  12. Click Save to save your triggers.
  13. Now it is time to test.  I’ve populated the student list and the device list with 9 rows of data each.  As you can see, both ID number for the student and inventory tag for the loaner devices are 6 digit repetitions of 1 through 9 (for ease of entry while testing).
  14. 14Open up your copy of the checkout form, then click the preview button to open the published version of the form.
  15. Fill out the form with “111111” for both short answer questions, select “Device not charged” for the multiple choice question, then NEXT, then SUBMIT.
  16. Go back to your spreadsheet.
    1. On the “AllDevices” sheet, you should see device 111111 is now marked unavailable, and checkout data has been populated at right.
    2. On the “Students” sheet, student 111111 should now have usage data to the right of their student data.
    3. On the “Totals” Sheet, you should have today’s date with a “1” at right denoting the number of checkouts that have happened today.
    4. Finally look at the “Log” sheet.  You should have a log entry recording the activity on the system.
  17. 17Now try checking the device back in.  Open your copy of the the check-in form and click the preview icon to view the live form.  Enter “111111” on the form, then click SUBMIT.
  18. Take a look at the “AllDevices” sheet again.  The device should be marked as available once again.  Then look at the “Log” sheet and notice the new row there.
  19. Finally, take a look at your email.  You should have a check-in and checkout email receipt from the system.


If you have read this far, you may be considering using this system.  Please feel free to do so (and hopefully improve it).  I recommend thoroughly testing (and understanding) this system (along with the other functions I didn’t run you through in this tutorial) before putting it into production.  I also encourage you to consider using service accounts with this for the reasons I stated above.

If you do end up using it or are stuck trying to implement it  (or just want to tell me what I didn’t think of, did wrong, etc.), please leave me a comment below and I’ll do my best to reply.  I’d also like to thank @knollmatt for his help with writing and testing some of the functionality.

Set Up a Single Filing System Using Google Drive Sync for PC

Tired of having one filing system for files on your computer and another in Google Drive? You can use Google Drive Sync to store everything in a single filing system that allows you access to your files from any device. And as an added bonus, if your computer croaks, all your files will be safe. I recommend you suffer through 6 minutes of my voice and watch the video below. This is definitely the best (and easiest) way to organize your files and keep them backed up.


Mass Data Entry into Web Forms Using Google Apps Script

Recently I was presented with a scenario where a large amount of data that was stored in a spreadsheet needed to be entered into a system with no mass upload feature.  Since the alternative was having someone wear the paint of their keyboard copying and pasting, I needed to automate it.

Most systems provide a way to do this via the uploading of a CSV file.  Some small niche products either lack this feature or require the user to pay for the provider to add the data on the back end.  This system, which shall remain nameless, had this issue.  Here is the interface I was working with:


I have hundreds of names that need to be entered for each year, going back several years.  There were two problems I needed to solve.

Problem #1 – There are only 10 fields to enter data into.

Problem #1 is really easy to fix using the iMacros for Chrome extension.  iMacros allows you to record and play back interactions with a web browser (like clicking a button several times).  Here are the steps I used to get the number of text boxes I needed.

  1. Install the iMacros for Chrome extension.
  2. Go to the page that contains the web interface you need to interact with.
  3. Click the iMacros extension icon to open the interface.
  4. Click Record then Record Macro.
  5. Click the button in the web interface that you would rather not repetitively press (in my case, the “Add More Name” button).
  6. Click Stop.
  7. The iMacros editor will open.  You should have 3 lines of code.
    1. Line 1 is version information, ignore it.
    2. Line 2 tells the web browser to go to the page you are on.  Since we are going to loop this code, we don’t want it opening the web page every time.  To prevent that, simply delete this line.
    3. Line 3 is what “clicks” the button.
  8. Once you have removed line 2, click the Save & Close button.
  9. With the web interface of the system you are using, select #Current.iim (the default macro you just created) in the left column.
  10. Click Play Macro.  This should perform the click, and the result should be displayed (in my case, 2 input boxes are added).
  11. I want to add 100 more boxes however.  Because each click adds two boxes, I’ll need to run this macro 50 times.  Under “Play macro repeatedly”, change “Max” to “50” and press Play Loop.  The macro should run 50 times, and the desired result should be shown in the web interface.

Here is a short video of this in action:

Problem #2 – Get the information from the spreadsheet into the web form.

Here is what my spreadsheet looks like:


I have all the names I want to enter in column ‘A’ of a Google Sheet – all I need to do is automate their entry into all the fields I generated above.  The way I chose to do this is with a keyboard emulator.  I often use keyboard emulators to perform repetitive tasks – they allow you to write code that emulates the pressing of keys on your keyboard.  One example is a physical keyboard emulator I use (USB Rubber Ducky) to automate the process of enrolling Chromebooks.

In this case, I am going to use a software emulator.  WinKeySim is the emulator I chose for this project, there are several other freeware versions available.

In order for this to work, we need to create the list of commands to put into WinKeySim.  Based on WinKeySim’s syntax, the pseudo-code would look something like this:

1 open the command with ["
2 set x to 1
3 add the name from row x
4 if x != the last row
  wait for 200ms [!200] and send a [tab] to go to the next field
  repeat from 3
5 else this is the last row so close the command with "]

I won’t go over the intricacies Google Apps Script here.  I will tell you it is a very powerful tool, and if you use Google Apps and have a need to automate, it will prove very useful to you.  Based on my spreadsheet above, here is the code I used to build the command I used with WinKeySim.

function myFunction() {
 //get the active spreasheet
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 //get the sheet named 'Sheet1'
 var sheet = ss.getSheetByName("Sheet1");
 //get the row number of the last row
 var lastRow = sheet.getLastRow();
 //create a new google doc to store the emulator commands in
 var doc = DocumentApp.create('Honor Roll Students');
 var body = doc.getBody();
 var text = body.editAsText();
 //start the document with [" (syntax for WinKeySim)
 //loop through each row of the spreadsheet
 //get the name in column A
 var name = sheet.getRange(i,1).getValue();
 //append the name to the sheet
 //if we are not at the last row, add a 200ms delay and
 //send a tab to change fields (syntax for WinKeySim)
 if(i !== lastRow){
 //if this is the last row, end the docuemnt with "]
 if(i !== lastRow){

When executed on the spreadsheet of names, this will spit out a new Google Doc into my Google Drive containing the emulator command I will use to input the data.  It will look something like this:


I can then paste that command into WinKeySim and the data will be entered automatically.  Check out the video below to see it in action.

If you have any questions about this, please leave a comment below!

Distributed Announcements With ChromeOS and Chrome Sign Builder

chrome_sign_builderProblem: You work at a school or business and want to a cost-effective and simple to deploy solution for distributing information to displays across your campus or enterprise.

If your organization uses Google Apps for Education or Google Apps for Work, you are in luck!  Chrome Sign Builder is a great application for accomplishing this.  In this post I will outline how I used this tool to distribute daily announcements (via Google Slides) to multiple locations throughout our building.  Using our existing wireless network for connectivity, I was able to put 65″ LCD TVs in multiple locations for $1,133 per location ($929 of which was the display itself).

Breakdown of products purchased:

What it looks like:


Dell’s Chromebox comes with a VESA mounting plate that is the same footprint as the device.  This display didn’t have a place to mount the plate (most don’t), but because the Chromebox is very lightweight I was able to use mounting tape to secure that plate to the back of the display, then “drop in” the Chromebox onto the mount.

Suggestions for lower cost implementations:

  • Use a smaller / less expensive TV – We used 65″ TVs because these were going in large rooms and we wanted students to be able to see the information at a distance.
  • Use a Chromebit instead of a Chromebox – I used Chromeboxes because I was familiar with them and wanted the ability to secure the device using a security cable.

Chrome Sign Builder Initial Setup:

  1. Enterprise enroll the ChromeOS devices you are planning to use so that they show up in your Google Admin Console.  The ChromeOS devices need to be managed for this to work, hence the ChromeOS Management Console License included in the Chromebox purchase listed above.
  2. Create a device OU in your Google Admin Console for your signage devices. You’ll need one OU for each configuration, but multiple devices may have the same configuration.  In my situation, I have several displays, but they all display the same content, so I only needed one OU.
  3. Move your newly enrolled devices into the applicable OU.
  4. Using an account hat has access to devices in the Google Admin Console, go to the Chrome Web Store and install Chrome Sign Builder.  (Note: You do not need to do this on the signage devices – your normal computer will work just fine)
  5. Launch Chrome Sign Builder.

Setup a Schedule:

You should have a default schedule under “My schedules” and a calendar shown at right (as seen below).  In this example, I am going to show how to loop a single presentation, forever (other scenarios are supported, see here for other use cases).  Below you’ll see how to automatically re-load the presentation so that changes made to the slide deck are reflected on the displays automatically.

  1. schedule12Select the schedule you would like to use from the left column (or create a new one).
  2. Click in the “all-day” row of the date you want to start displaying your content.schedule3
  3. Paste the URL of the Google Slides file that contains your content into the URL box and click the “Open Advanced Drive Configuration” option that appears.schedule456
  4. Set your options for your presentation.  In my example, I turn all of these on.
  5. Set the amount of time you want each slide to be shown.  In this screenshot, it is set to 3000ms.  1000ms = 1s, so 3000ms is 3 seconds.
  6. Click “Done”.schedule7910
  7. Check “Show forever” to repeat this schedule every day moving forward
  8. Click “Advanced…”
  9. Check “Automatically reload url” and provide a value for how often the URL should be reloaded.  Note: Using this option is important if you want modifications made to the slide deck to reflect on the displays.  I reload mine every 10 minutes.
  10. Click “Save”schedule1112
  11. You should now have an entry in your “all-day” row.  Click it to make modifications if necessary.
  12. Once you are satisfied with your configuration, click the green “EXPORT” button.
  13. Name and save the policy file in an easily accessible location (like your desktop).

Deploy Your Configuration:

Once your export file is saved, you should be directed to log into the Google Admin Console.  If you aren’t sent there automatically (or want to revisit your deployment settings later), you can find it under Device Management > Chrome Management > App Management > Chrome Sign Builder.

  1. deploy15In the “Kiosk settings” section, select the OU you created that contains your signage devices.
  2. Turn on both “Install automatically” and “Allow app to manage power” (if the parent container does not have these settings applied, you’ll need to click the “Override” hyperlink under each switch first).
  3. Click “Upload Configuration File”, then select the file that contains the configuration file you exported in the previous section (if you don’t see this button, you’ll need to click the “Override” button beneath “Configure”).
  4. Click “Save”.
  5. Click the “device settings page” hyperlink.deploy67
  6. In the left hand column, select the OU that contains your signage devices.
  7. In the “Kiosk Settings” section, select “Chrome Sign Builder” for the “Auto-Launch Kiosk App” drop-down list.
  8. Make sure to click “SAVE” to apply your changes.

Congratulations – you’ve just told the devices in that OU to launch Chrome Sign Builder as a kiosk app and configured them to display your content automatically!  Go turn on your ChromeOS device(s) and enjoy your distributed content!

If you have questions about this process or have a tip on Chrome Sign Builder, please leave a comment.

Useful Links:

Dell Chromebook 11 Service Tag

UPDATE: You can now just powerwash the device and press ALT + V at the welcome screen to get he serial.  (see here)

I had a large delivery of Dell chromebooks recently, and while sorting them into OU’s using Andrew Stillman’s awesome chromebookInventory script, I was unable to locate one of the devices in the dashboard.  Assuming something went wrong during enrollment, I powerwashed it and re-enrolled.  Still unable to find it in the dashboard, I sorted by enrollment date.  What I found, was that the device I enrolled had a different physical service tag than was listed in the “serial number” column of the dashboard.  Strange…

I started searching the internet for another way to get the serial number, but kept getting linked back to my original post on getting a serial number off of a Chromebook.  After a wasted chat with Dell support, Google support was able to give me the process.dell_chromebook_serial

The process below involves booting the device into “developer mode” which can impact local user data. Please follow the process below at your own risk.

  1. Enter Chromebook developer mode:
    1. Press esc+refresh (the circular arrow)+power
    2. You should see the “Chrome OS is missing or damaged” screen, press ctrl+d
    3. To turn OS verification off, press enter
    4. The screen will inform you that OS verification is off, press ctrl+d
    5. Entering developer mode can take up to 15 minutes (this machine took less than 5 minutes).  A progress bar is shown across the top of the screen.
    6. Upon completion, the device will reboot and return to the OS verification screen.  Press ctrl+d to continue in developer mode.
  2. Retrieve the serial number:
    1. Connect the device to wifi using the welcome screen and agree to the ToS
    2. Log into the chromebook (if you have forced enrollment enabled you may have to re-enroll first)
    3. once the welcome screen loads, press ctrl+alt+t to open the terminal
    4. type “shell” and press enter
    5. type “sudo bash” and press enter
    6. type “vpd -l” and press enter
    7. Your should see a screen (like the one above) containing the serial number of your chromebook.
  3. Exit developer mode:
    1. Turn the chromebook off
    2. Turn the chromebook on
    3. The OS verification off disclaimer is shown, press spacebar, then press enter
    4. OS verification is now on (green checkmark) and the chromebook will reboot.  The device will again be cleared and you’ll need to go through the initial setup (wifi, ToS, enrollment).

While the scenario that affected me is very unlikely, this process would also be helpful to determine the serial number or service tag of a device whose physical tag is missing or damaged.  I hope this helped you – please leave any questions in the comments below.

Exporting Your Files From Google Drive

drive_export_graphicSummer is almost here, and the seniors are about to walk out the door for the last time. That used to mean throwing both their paper and digital items into their respective recycling bins. Now, with their physical and digital lives becoming more and more intertwined, students want to hang onto data for their digital portfolios or to use as a reference moving forward. Whether you are a senior in high school taking the next step, or a staff member moving to a new organization, the ability to separate your data from your current Google account may be very important to you.

You may have asked yourself “Why don’t I just make a personal Google account (or use my existing one), then share all my files with the new account, and change the ownership?”  Well…

  • If you are using a Google Apps domain account (an account that is part of an organization) and not a personal Google account, you won’t be allowed to change ownership of files to an account outside your organization.
  • Even If your situation does allow a change of ownership solution, your first thought will likely be “I’ll just put all my stuff in one folder then change ownership on that folder.”  Unfortunately ownership changes are not applied to child objects.  Eventually I plan on writing a script that allows the use to propagate ownership changes using setOwner() (or more likely someone will beat me to it (or already has)).
  • It is technically possible to share all your files from your domain account to a personal account and then make copies of all the files, but that only works if your organization allows you to share outside the domain.  If you are able to utilize this method, this is usually a better option than exporting (if you plan to subsequently import back into another Google account that is).

star_smallTip: If you decide to used the share and make copies method, your inclination will be to put everything in one folder and then share the folder with the account you are transferring your files to.  This will work just fine, but it is important to note that when you make copies in any shared folder that you have “Can edit” access to (as you would in this example), the copies will be created within that folder (which is on the Drive of the account you are trying to get the data off of).  You’ll need to drag and drop the items into “My Drive” on the account you want to move the data to.

Depending on your situation, exporting your data may makes the most sense.  Before you go down that path, here is what you need to know:

Exporting Pros:

  • Your Google Documents will be converted to standard formats (Microsoft or OpenDocument) so you’ll have versatility with your data moving forward.
  • There are two ways to export your data, they are both really easy to use, and can be used in combination to best suit your needs.

Exporting Cons:

  • Neither export option supports the download of Google Drive file types in their native form. (hopefully this is coming soon – hear me awkwardly ask for it at #io13)  Features unique to Google Drive such as revision history, comments, and sharing settings aren’t supported in the exported formats, so they will be discarded.
  • You are converting your files.  In my experience, converting files back and forth between Google Docs and Microsoft Office (or OpenDocument) works well.  However, anytime “converting” is part of a process, there is potential for problems.  Most of the problems I’ve seen however tend to be easily fixed layout problems, not problems retaining text or images.

Exporting Directly From Google Drive vs. Exporting With Google Takeout

Both methods produce the similar results.  When complete, you’ll have a compressed (ZIP) file containing the items from your Google Drive.  Google Document types (Documents, Drawings, Forms, Presentations, and Spreadsheets) will be converted to the format you selected, while other file types in your drive (PDF, Photoshop, JPEG, etc.) will be left in their original format.

Exporting Directly From Google Drive

The advantage with this method is that it is much easier to export items under “Shared with me” than with the alternative method. The downside is, that you can’t download more than 2 GB at a time.  There is no way to automatically separate your files into multiple downloads, but it is possible to do so manually.  Check out the following video outlining the process.

Exporting With Google Takeout

Google Takeout is a product made by a group of engineers at Google who call themselves the data liberation front.  What is nice about Takeout is that it exports more than just Drive data; it will give you a single zip file containing all (supported) Google data.  The downside of Takeout, specific to Drive, is that your export won’t include files under “Shared With Me”.  Many users only want a couple of items from shared anyhow; they can always just make copies of those specific items and place them in their Drive before they export.  Check out the following video outlining the process.


If you are not permanently breaking up with Google, the best way to get your data out of Drive is to not get it out at all.  If the task of changing ownership or sharing and making copies of your files is both realistic and possible, you should take that route.  If you need to export your data from Drive, I’d suggest using the Drive interface.  I believe the interface is less intimidating for the average user, and coupled with the ability to easily export “Shared with me”, the advantages outweigh the 2GB export limitation.  If you want more Google data than just what is in your Drive, use Takeout in addition to the Drive interface.s  You can export Drive data using the Drive interface, then use Takeout to export your additional data.  They can be used very effectively in combination.

Bonus Round: I’ve Got My Data Out, Now What?

So now you have one or more zip files containing all your converted and downloaded data.  You have a couple of options, and you don’t have to decide now.  If you aren’t prepared to commit to a new home for your data, just put the files in a safe place like a flash drive or cloud storage service (or both!).

If you are planning to use the data on your personal computer in its current Microsoft or OpenDocument format, extract the data from the zip drive and file it away on your computer.  If you have a personal Google Account, or access to your Google Account at your new school or business, you could upload the data there, and convert your files back to Google Drive formats in the process.

  1. Log into your “new” Google account and go to your Drive.
  2. Check your upload settings.  If you want to convert your data back to Google Document types, make sure your upload settings are set to support that.
  3. Extract the data from your zip file and locate the folder containing the data you want to upload.
  4. Finally, upload the folder containing your data.

I hope you found this tutorial helpful.  Let me know if you have any questions or comments below.

Creating a Bookmark as a Chrome App

cghs_chrome_appI published my first “app” to the chrome web store today (I use the term app loosely).  When installed, it allows the user one-click access to the Cary-Grove High School web page.  Your first question may be “Why?”.

  1. It provides another avenue to your users for accessing important services.  Bookmarks are effective for some users, others prefer to have Chrome open to a predefined set of URLs.  Alternatively, providing a Chrome app allows one-click access from the new tab page for those who want that option.
  2. Apps can be easily pushed out using the Google Apps Control Panel.  While I’m unlikely to force this specific application on my users, this can be useful in several other scenarios.  For example, if I’m a Google Apps for Business customer and my accounting department are all heavy users of a cloud-based accounting system, I could  pre-install an app to their Google account that links directly to that service.  From the first time they log into Chrome, the app will be at the ready on their new tab page.

Google has several good tutorials for creating apps for the Chrome Web Store; I used this one.  A few things to know before if you want to make an app similar to mine:

  1. You’ll need to verify your site with Google Webmaster Tools.  Verifying a site proves that you have ownership of the site.  There are several options for site verification (I used a meta tag).  More information on site verification can be found here.
  2. You need to use the same Google account to verify your site that you are going to be using to publish your application.
  3. If this is your first app, you’ll need to pay a $5 fee to become a registered developer.
  4. You have up to 16,000 characters available for a detailed description.
  5. You’ll need to provide some graphic elements (full details).  At minimum you’ll need:
    1. one 128x128px icon (your app icon)
    2. one 1280x800px (preferred) or 640x400px screenshot
    3. one 440x280px promotional image

The process was very straightforward.  If you have any questions or comments, leave them below.  Good luck on making your first app!

Prevent Windows Update from Automatically Rebooting Your Computer (Windows 7)

I recently had a user complain that their computer randomly restarted to do updates.  What likely happened is that they didn’t notice the popup warning them what was about to happen (as seen below).


Your computer needs to be rebooted after certain updates, but the way Microsoft goes about making that happen isn’t very user friendly.  If you are a person who shuts down or reboots your computer every day, I’d suggest revoking Windows Update’s ability to restart your computer.

WARNING_SMALLWarning – This procedure involves modifying group policy.  The procedure itself is quite simple, but you can cause some serious issues “playing around” with group policies if you don’t know what you are doing.  Proceed at your own risk!

  1. Click the start button, type “gpedit.msc” (into the search box), then hit the enter key on the keyboard.
  2. The “Local Group Policy Editor” should now be open.  Use the left column to navigate to Administrative Templates > Windows Components > Windows Update (as seen below).
  3. Double-click the No auto-restart with logged on users for scheduled automatic updates installations item in the right column.
  4. Click the Enabled radio button then click Apply, then click OK (as seen below).
  5. Close the “Local Group Policy Editor”

Your computer should no longer prompt you to reboot in order to apply updates.  The updates will still be applied the next time your computer is (re)booted, but you are no longer at the mercy of the “Postpone” button.  Free at last!