Google Sheets - Combine All Sheets into One When Column Order Doesn't Match - Apps Script - Part 17

Learn how to combine multiple tabs to one master tab when you have random column order using Apps Script in Google Sheets.
Script: www.chicagocomputerclasses.co...

Пікірлер: 95

  • @davidduran2984
    @davidduran29844 жыл бұрын

    Hmmm... I am having troubles at minute 13:38. I use this script: function myfunction(){ var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); for([i,sheet] in sheets){ console.log(sheet); } } But when I check the logger, instead of getting "sheet, sheet, sheet, sheet" I get "undefined, undefined, undefined, undefined". If I use Logger.log instead of console.log I got null, null, null, null. I checked the script for missing commas or something and I was unable to find the problem. I also got the four sheets in the spreadsheet . Can you give me a hand about this please?

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    4 жыл бұрын

    Due to engine update for([i,sheet] in sheets){ should be for (let [i, sheet] of Object.entries(sheets)) {

  • @davidlewis3539

    @davidlewis3539

    4 жыл бұрын

    @@ExcelGoogleSheets UPDATE: I've been typing sheets and not sheet to get whole time. My apologies. You are the GOAT of GAS. Keep the videos coming! This seems to not work very well. I was having a hard time getting the values out especially since you have to use the `${value}` notation. I couldn't get it to a variable or anything. So i ended up using sheets.ForEach(function(sheet){ logger.log(sheet.getSheetName()) }) where GAS let me add the ".getSheetName" to the variable this time. Let me know what you thing. Thanks!

  • @javaejercicios4442

    @javaejercicios4442

    4 жыл бұрын

    This works too: var sheets = SpreadsheetApp.getActive().getSheets(); for(k in sheets){ Logger.log(sheets[k].getSheetName()); };

  • @javaejercicios4442

    @javaejercicios4442

    4 жыл бұрын

    @@davidlewis3539 Functional programming is always welcome. The procedure that you provide will be the one that I should use in real world programs.

  • @LuizFernando-ti1xx

    @LuizFernando-ti1xx

    3 жыл бұрын

    @@javaejercicios4442 Nice!

  • @GeorgePlaten
    @GeorgePlaten5 жыл бұрын

    I love how you teach without everything being over prepared. That style always looks like magic and can be a real confidence blow. Watching you work this way, shows me how to build a solution step by step using Logger, to be patient, to expect problems to arise and how to deal with them. Awesome. Thank you.

  • @WilsondotZeroFaustino
    @WilsondotZeroFaustino6 жыл бұрын

    Awesome! Can't wait for more videos like this. :D

  • @MicrowaveHateMachine
    @MicrowaveHateMachine4 жыл бұрын

    Nice. Exactly what I needed.

  • @blockwest2379
    @blockwest23793 жыл бұрын

    hahaha. this is awesome. they way you get to your goal ("..... and I DO IT the "hacky-way" now at min 09.37) is phenomenal. thx

  • @richasahay1
    @richasahay15 жыл бұрын

    Awesome and really helpful one! Would it be possible to execute your last words for improvements as I am facing the same issue. I have few other tabs also and I do not want to touch them. Please share the script with us. Also I have one question for example if the sheet does not have Region signal as per State signal, can you help me to create if statements and that can be used in master sheet to get states for all regions :) Cheers from India

  • @andersonlewis853
    @andersonlewis8536 жыл бұрын

    This video was extremely helpful! Thank you so much for posting. I am impressed (and envious) that you were able to build this script on the spot! I have to agree with Robert Evans to some degree. If this video were organized, planned and edited a little better, it would be easier to follow and probably shorter. Don't take this constructive criticism as a dig though. Do these things and I think you'll be on your way to having a premier youTube resource for all things G-Sheets.

  • @nicholasbryan7704
    @nicholasbryan77043 жыл бұрын

    @LearnGoogleSpreadsheeets did you ever make that improvement at 31:50? Keep up the great work

  • @pluspunktnachhilfeschule2988
    @pluspunktnachhilfeschule29882 жыл бұрын

    Hi! Everything works perfectly with the update "for([i,sheet] in sheets){ should be for (let [i, sheet] of Object.entries(sheets)) {" Thank you very much! Can you PLEEEEAAASE make a version where I can ignore multiple sheets besides the "MasterSheet"? This would be awesome!!

  • @rinchendorji7477
    @rinchendorji74773 жыл бұрын

    thank you very much....i have favor to ask you. i want to create column D where it will show its corresponding sheet name. can you help me out here?

  • @nehagoenka864
    @nehagoenka8643 жыл бұрын

    Hi Thanks for this tutorial. The script seems to work, in that its not giving me an error. However, I am not being able to combine the date because the scripts seems to run out of time. Could I have too much data on hand? I am trying to combine data from a 100+ sheets that total close to 18,000 rows.

  • @cheslg6809
    @cheslg68094 жыл бұрын

    is i in the for loop defined as index already whether i write it as [sheet,i] or [i,sheet] or does it follow [key, values] format sequence??..why did you declare i in the for loop that you didn't actually use there but in the forEach loop only?

  • @khemrajrana7322
    @khemrajrana73225 жыл бұрын

    Dear sir how to select all column name range in one time with macro in many sheets plz solve my query

  • @phoenixempire8886
    @phoenixempire88863 жыл бұрын

    🙏🏻

  • @findthetruth3021
    @findthetruth30214 жыл бұрын

    Hi I have a question please help me. I have the below google script to movew cells after i put i word for instance once I say "ok" then the row will be moved into another sheet based on my confirmation as I have wrote "ok", but I want to add another word beside "ok", for instance I want to have two words "ok'' or "confimed'' to do the same thing, i have been working on it since two days but I can't execute this function; I don't any videos on youtube as well to show how to run different/ multiple google scripts in one sheet. below is the script just tell how can i add another word beside the ''ok''. Thanks in advance. Please replay me back ASAP. I really need to complete it by the end of this month. /** * Moves row of data to another spreadsheet based on criteria in column 6 to sheet with same name as the value in column 4. */ function onEdit(e) { // see Sheet event objects docs // developers.google.com/apps-script/guides/triggers/events#google_sheets_events var ss = e.source; var s = ss.getActiveSheet(); var r = e.range; // to let you modify where the action and move columns are in the form responses sheet var actionCol = 1; var nameCol = 4; // Get the row and column of the active cell. var rowIndex = r.getRowIndex(); var colIndex = r.getColumnIndex(); // Get the number of columns in the active sheet. // -1 to drop our action/status column var colNumber = s.getLastColumn()-1; // if our action/status col is changed to no do stuff if (e.value == "ok" && colIndex == actionCol) { // get our target sheet name - in this example we are using the priority column var targetSheet = s.getRange(rowIndex, nameCol).getValue(); // if the sheet exists do more stuff if (ss.getSheetByName(targetSheet)) { // set our target sheet and target range var targetSheet = ss.getSheetByName(targetSheet); var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber); // get our source range/row var sourceRange = s.getRange(rowIndex, 1, 1, colNumber); // new sheets says: 'Cannot cut from form data. Use copy instead.' sourceRange.copyTo(targetRange); // ..but we can still delete the row after s.deleteRow(rowIndex); // or you might want to keep but note move e.g. r.setValue("moved"); } } }

  • @murtuzakantawala1613
    @murtuzakantawala16132 жыл бұрын

    Here in this video we can see the spreadsheet is 1 with multiple sheet i want to combine different spreadsheet into 1 master spreadsheet i am having some different columns name and column orders also how can i do that is it possible ?

  • @heincetheopilus9265
    @heincetheopilus92652 жыл бұрын

    hello, how to Combine All Sheets into One When Column Order Doesn't Match but not using apps script? can you show me how to do? if using excel i can do with power query but i need to used google sheets. thx you so much

  • @TheTramos00
    @TheTramos003 жыл бұрын

    I was getting the error Cannot read property 'getSheetName' of undefined (15:55) and had to change to for (var i = 0; i var sheetName = sheets[i].getSheetName(). Aparently for([i, sheet] in sheets) returns null

  • @mariamasood1761

    @mariamasood1761

    3 жыл бұрын

    I used your logic but it still gives the same error. Any suggestions? Here's the code: function getCombinedColumnValues(label,masterSheetName) { var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); var colValues = []; for (var i = 0; i var sheetName = sheets[i].getSheetName(); if(sheetName !== masterSheetName) { var tempValues = getColumnValues(label,sheetName); colValues = colValues.concat(tempValues); } }

  • @TheTramos00

    @TheTramos00

    3 жыл бұрын

    @@mariamasood1761 replace for (var i = 0; i < sheets.length; i++) with for (let [i, sheet] of Object.entries(sheets))

  • @mariamasood1761

    @mariamasood1761

    3 жыл бұрын

    @@TheTramos00 It still throws the same error. This is the sheet if you want to look at, please send request for access: docs.google.com/spreadsheets/d/1_tXgP7HK_4nuBVrGRUzhY9ezChP2liXEIYClMaSyar8/edit#gid=0

  • @guilhermemauriciodantas9064
    @guilhermemauriciodantas90645 жыл бұрын

    How I import a range from another spreadsheet using the app scripts?

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    5 жыл бұрын

    Watch my recent web app videos, you'll see examples of that.

  • @maxyusupov9508
    @maxyusupov9508 Жыл бұрын

    Hi sir I would like to use your script code for differen way for example you have labels in mastersheet those labels contains similar values in state column from other sheet and there is sales value that contains values that belongs for each states how can i use your code to get vertical information from previous sheet that mathches horizontal label in mastersheet and pastes it one after one raw with button click thank you in advance for your videos it is very usefull and interesting

  • @thinhse
    @thinhse4 жыл бұрын

    For some reason, I could not verify new projects any more as it says "Sign in with Google temporarily disabled for this app. Sign in with Google temporarily disabled for this app". I have waited for nearly a month but still not resolved yet :-( Any idea?

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    4 жыл бұрын

    Check if you have installed any addons that haven't been updated recently. If you find any try to delete them and their previous authorization.

  • @meisterfurstengraf9675
    @meisterfurstengraf9675 Жыл бұрын

    Thank you for your great content! I am stuck at 22:28... The function GetCombinedColumnValues worked just fine, but when I insert label and MasterSheetName and run it in the MainFunction, it only returns the data of one sheet. Any idea what went wrong? function MainFunction() { var ColValues = GetCombinedColumnValues("Date", "Master"); Logger.log(ColValues); } function GetCombinedColumnValues(label,MasterSheetName) { var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); var ColValues = []; for (let [i, sheet] of Object.entries(sheets)) { var sheetName = sheet.getSheetName(); if (sheetName !== MasterSheetName){ var tempValues = GetColumnValues(label, sheetName); ColValues = ColValues.concat(tempValues); return ColValues; } } } Thank you for your great work with this channel :)

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    Жыл бұрын

    try for (let [sheet,i] of Object.entries(sheets)) {

  • @joepvanschagen8164
    @joepvanschagen81644 жыл бұрын

    Awesome script! However, since V8 Runtime is introduced I get the following error: "Cannot read property 'getSheetName' of undefined"... Is there a way to fix this issue? Thanks in advance!

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    4 жыл бұрын

    I would need more context than this.

  • @joepvanschagen8164

    @joepvanschagen8164

    4 жыл бұрын

    @@ExcelGoogleSheets I just found a workaround on Stackoverflow :) statement "for ([i, sheet] in sheets)" does not work anymore in V8. A workaround for this is using "for (var i = 0; i < sheets.length; i++)"

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    4 жыл бұрын

    @@joepvanschagen8164 that makes sense

  • @joepvanschagen8164

    @joepvanschagen8164

    4 жыл бұрын

    @@ExcelGoogleSheets I am trying to find the video you refer to in the beginning of this video, but can't find it. Could you share a link? :)

  • @jasondahl3167
    @jasondahl31674 жыл бұрын

    Is there a way to do this using query instead of this script?

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    4 жыл бұрын

    kzread.info/dash/bejne/dYqf28iAhbaulco.html

  • @ConnectingEvidence
    @ConnectingEvidence3 жыл бұрын

    I'm getting the following: Exception: The parameters (number,null,number,number) don't match the method signature for SpreadsheetApp.Sheet.getRange. (line 36, file "practice") Line 36 has the following: var colValues = ss.getRange(2, colIndex, numRows, 1).getValues(); I feel like it has something to do with the method i'm using to loop through the tabs: for(k in sheets){ var sheetName = sheets[k].getSheetName(); if (sheetName !== "Master"){ var tempValues = getColumnValues("ID", sheetName) colValues = colValues.concat(tempValues); } }

  • @ConnectingEvidence

    @ConnectingEvidence

    3 жыл бұрын

    I figured it out! My issue was with the if statement I believe. I have several tabs to include and exclude. Part of my challenge is that I do not completely understand looping. Below you'll find my code. for(k in sheets){ var sheetName = sheets[k].getSheetName(); // the code below does not include BHC Peninsula because there is currently no data in it. That does not allow the code to work. if ((sheetName == "Data BHC Padres Unidos")||(sheetName == "Data CCA")||(sheetName == "Data COPA")||(sheetName == "Data MujeresEnAccion")){ var tempValue = getColumnValue(label, sheetName) colValues = colValues.concat(tempValue); } };

  • @dulichandprajapat928
    @dulichandprajapat928 Жыл бұрын

    var sheetName = sheet.getSheetName(); In this line, getSheetName() doesn't supports anymore. Can you help in that?

  • @roberttomaszewski8284
    @roberttomaszewski82843 жыл бұрын

    Hi, I have similar problem as below, but with last function (combineData) Instead syntax: labels.forEach(function(){}), I wrote this: for (let [i, label] of Object.entries (labels)){ console.log(i + 1) } } But when I'm trying to increase this "i" by 1, I'm getting 01, 02, 03 instead 1, 2, 3 Anybody can help me with this?

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    3 жыл бұрын

    are you sure it's 01, 02, 03 and not something different

  • @roberttomaszewski8284

    @roberttomaszewski8284

    3 жыл бұрын

    @@ExcelGoogleSheets Right! Console returns 01, 11, 21. It looks like text joining. If I write for example (i +10), I have 010, 110, 210

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    3 жыл бұрын

    console.log(parseInt(i) + 1)

  • @bocobox
    @bocobox4 жыл бұрын

    Hello. I am getting an error that says "TypeError: Cannot read property 'getSheetName' of undefined (line 31, file "Code")". I copied this code from your website. the error still pops up. anybody can help?

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    4 жыл бұрын

    for V8 engine change for([i,sheet] in sheets){ to for([i,sheet] of Object.entries(sheets)){

  • @johnsmith-mb1ry
    @johnsmith-mb1ry4 жыл бұрын

    I'm getting an error that says, "The starting column of the range is too small. (line 46, file "Code")." I copied the code from your website and the error still pops up.

  • @adityasvasisht4743

    @adityasvasisht4743

    4 жыл бұрын

    I'm getting the same error also

  • @rivosuoth

    @rivosuoth

    4 жыл бұрын

    Check the partial sheets. There is at least one of the labels in the master sheet that is not found in a partial sheet. The current code is case-sensitive, so be aware of that. That means, if it doesn't find the exact label, the error comes up. 44 var colIndex = getColumnIndex(label,sheetName); // if it doesn't find the exact match, getColumnIndex() returns -1, thus colIndex is -1 45 var numRows = ss.getLastRow() - 1; 46 var colValues = ss.getRange(2, colIndex, numRows, 1).getValues(); // then, the error tells it literally Also, this code is not designed to either include or exclude sheets, it only include all sheets except the master sheet (line 31). That means if your spreadsheet happens to have Not Partial Sheets, they will be included in a loop (line 29), because it doesn't find a label in their first row it will complain with the same error (again, line 46).

  • @rivosuoth

    @rivosuoth

    4 жыл бұрын

    To make the code more verbose. 1. Normalize the label, 56 let lookupRangeValues = ss.getRange(1, 1, 1, lc).getValues()[0].map(label=>label.toLowerCase()); 57 58 let index = lookupRangeValues.indexOf(label.toLowerCase()) + 1; 2. or, Use regex with loop/filter instead of indexOf to get the index 58 let index = +Object.keys(lookupRangeValues).filter(key=>lookupRangeValues[key].match(new RegExp(label, "i"))) + 1; // using new Chrome V8 3. It is suggested that if you really have partials and non partials in the same spreadsheet, name the sheets according to some convention like "_Partial 1", "_partial2", and you can include sheets just the sheets that match "^_", like the folowing 31 if(sheetName !== masterSheetName && sheetName.match(/^_/) ) { // you could extract the regex to the top function

  • @casianreport3318

    @casianreport3318

    4 жыл бұрын

    @@rivosuoth Thank you for the tip. YES. If you have other sheets with no label inside them, he give that error.+

  • @casianreport3318

    @casianreport3318

    4 жыл бұрын

    @@rivosuoth Your code is worked! Solved the problem. Come on mannn, thanks a lot!

  • @andrisreinholds8271
    @andrisreinholds82715 жыл бұрын

    Hey! Thanks for the video. Unfortunatelly code seems to be not working. Copied it from web page and tried to run it, but got errors.

  • @adityasvasisht4743

    @adityasvasisht4743

    4 жыл бұрын

    I'm also getting the same error

  • @mosintyagi5434
    @mosintyagi5434 Жыл бұрын

    I have facing error - The JavaScript runtime exited unexpectedly. Please help how I can resolve this issue.

  • @wctins
    @wctins4 жыл бұрын

    Unfortunatelly I'm stuck in minute 22. My formula gives the error: "The starting column of the range is too small." and says that the error is in this line: var colValues = ss.getRange(2, colIndex, numRows, 1).getValues(); Any idea?? Thanks

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    4 жыл бұрын

    something wrong with colIndex

  • @wctins

    @wctins

    4 жыл бұрын

    @@ExcelGoogleSheets Thanks, you right, this is the problem. Column with small data, like number of the month or year gives me the same error, but I need this data in my combined table. Can you help me how to fix this?

  • @allisonwaters9676

    @allisonwaters9676

    4 жыл бұрын

    @Operations Management I had re-ordered the headings but not capitalized them. When I went back and added the headers with Caps, it worked perfectly once again. Not sure if that's your issue, but I was getting the same error before that, and now it works perfectly.

  • @allisonwaters9676

    @allisonwaters9676

    4 жыл бұрын

    Mine was toward the end tho - like 36:00

  • @mariamasood1761
    @mariamasood17613 жыл бұрын

    Please help. It's giving error: TypeError: Cannot read property 'getSheetName' of undefined

  • @mr_shanes

    @mr_shanes

    2 жыл бұрын

    replace this code: for([i,sheet] in sheets){ with this code: for (let [i, sheet] of Object.entries(sheets)) {

  • @casianreport3318
    @casianreport33184 жыл бұрын

    Error : Exception: The starting column of the range is too small. Error at min 19:00

  • @casianreport3318

    @casianreport3318

    4 жыл бұрын

    If you have other sheets with no label inside them, when if statement search it, , he give that error. So you must move the code in a new sheet with only sheets + that label and master. You must not have any other sheets with no labels on it. Thats why give this error

  • @kurls123
    @kurls1233 жыл бұрын

    I recreated the code for another project and it doesn't work. I tested the first project and it still works. Any thoughts on why this might be? Here's a description of the problem: stackoverflow.com/questions/66575717/syntaxerror-unexpected-token-google-sheets-script-editor Here's the error I'm getting now: Exception: The starting column of the range is too small. getColumnValue @ Copy 2 of Code.gs:59 getCombinedColumnValues @ Copy 2 of Code.gs:39 (anonymous) @ Copy 2 of Code.gs:16 combineData @ Copy 2 of Code.gs:15 Before I was getting this: Syntax error: SyntaxError: Unexpected token ')' line: 14 file: Copy of Code.gs

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    3 жыл бұрын

    try changing this for(k in sheets){ var sheetName = sheets[k].getSheetName(); to this for(ws of sheets){ var sheetName = ws.getSheetName();

  • @kurls123

    @kurls123

    3 жыл бұрын

    @@ExcelGoogleSheets, Unfortunately, it did not work.

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    3 жыл бұрын

    @@kurls123 Sorry, you would need to troubleshoot and see what's causing this. It seems like you data in this spreadsheets might be in different format or layout.

  • @kurls123

    @kurls123

    3 жыл бұрын

    @@ExcelGoogleSheets I not sure what the issue is. I ended up creating a "master" tab with a query: =QUERY({'CBDIO Data'!A2:AX;'CCA Data'!A2:AX;'CHW Data'!A2:AX;'Mujeres en Accion Data'!A2:AX;'Padres Unidos Data'!A2:AX}, "select * where Col1 is not null",0) I wanted to able to create variables based on text in several columns so I used a different tab to do that. The query stops working if I add more columns. That was my workaround' .

  • @010bridge
    @010bridge2 жыл бұрын

    why show it null??? when I run for([i,sheet] in sheets){ Logger.log(sheet); } and show me: 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info null 2:47:55 PM Info 0 2:47:55 PM Info 1 2:47:55 PM Info 2 2:47:55 PM Info 3 2:47:55 PM Info 4 2:47:55 PM Info 5

  • @010bridge

    @010bridge

    2 жыл бұрын

    in other spreadsheet just two sheets to run it, it also show null: 2:53:21 PM Info null 2:53:21 PM Info null

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    2 жыл бұрын

    try for(let [i,sheet] in Object.entries(sheets)){

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    2 жыл бұрын

    This syntax was changed in V8 engine.

  • @seemyself851

    @seemyself851

    2 жыл бұрын

    Thank you very much!@@ExcelGoogleSheets

  • @010bridge

    @010bridge

    2 жыл бұрын

    @@ExcelGoogleSheets Thank you very much!

  • @ReevansElectro
    @ReevansElectro6 жыл бұрын

    Disorganized and unprepared. Next time, prepare a lesson plan and practice what you are about to teach.

  • @eiger67

    @eiger67

    6 жыл бұрын

    Instead a bad critic, we'd appreciate a constructive example of your knowledges building such scripts doing the same jobs like macros. My suggestion to you, just leave the channel!

  • @ReevansElectro

    @ReevansElectro

    6 жыл бұрын

    I gave you clear constructive criticism: prepare a lesson plan, practice what you are about to teach and I will add a third - edit your videos to cut out your blunders because you don't have to do it in one take. You have a chance to improve rather than be lazy. I have taught electrical engineering for 19 years and some days if I didn't have or make time to prepare, I sounded like you and tried to blunder my way through a lesson. Be professional.Your channel has a potential to be great. Watch some other KZread channels like: kzread.info/dron/u7_D0o48KbfhpEohoP7YSQ.htmlvideos

  • @ExcelGoogleSheets

    @ExcelGoogleSheets

    6 жыл бұрын

    No worries, thanks for your input. :)

  • @derekherzog1569

    @derekherzog1569

    5 жыл бұрын

    He's devoting time and resources to impart free knowledge to the public. Until you start doing the same with your electrical engineering lessons your criticism comes off as pretty entitled.

  • @einarparker

    @einarparker

    3 жыл бұрын

    @@ReevansElectro “blunders” are the most precious, teaches us that we all make mistakes, he is not pretending to be someone that he is not. You do not have to like his way of teaching. There are many ways and certainly some people would like your way of teaching. I hope you learned it since your comment.

  • @010bridge
    @010bridge2 жыл бұрын

    it show me: Error TypeError: Cannot read property 'getSheetName' of undefined at this line: Logger.log(sheet.getSheetName());