{"id":708,"date":"2020-08-27T23:53:49","date_gmt":"2020-08-28T02:53:49","guid":{"rendered":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/?page_id=708"},"modified":"2020-08-28T00:03:50","modified_gmt":"2020-08-28T03:03:50","slug":"formatacao-de-dados","status":"publish","type":"page","link":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/modulo-avancado\/aula-3-scripts-google\/formatacao-de-dados\/","title":{"rendered":"Formata\u00e7\u00e3o de Dados"},"content":{"rendered":"<h3 class=\"step-title\">Configurando<\/h3>\n<p>Antes de continuar, voc\u00ea precisa de uma planilha com alguns dados.\u00a0Como antes, fornecemos uma folha de dados que voc\u00ea pode copiar para esses exerc\u00edcios.\u00a0Execute as seguintes etapas:<\/p>\n<ol start=\"1\" type=\"1\">\n<li><a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1fQckft-DZXn4MDfQgjUSQdv5fKF0XZaBjqAwQ4Vxz7c\/copy\" target=\"_blank\" rel=\"noopener noreferrer\">Clique neste link para copiar a planilha de dados<\/a>\u00a0e, em seguida, clique no bot\u00e3o\u00a0Fazer uma c\u00f3pia\u00a0.\u00a0A nova planilha \u00e9 colocada na pasta inicial do Google Drive e \u00e9 chamada de &#8220;C\u00f3pia da\u00a0formata\u00e7\u00e3o\u00a0de dados&#8221;.<\/li>\n<li>Clique no t\u00edtulo da planilha e altere-o de &#8220;C\u00f3pia da\u00a0formata\u00e7\u00e3o\u00a0de dados&#8221; para &#8220;Formata\u00e7\u00e3o\u00a0de dados&#8221;.\u00a0Sua folha deve ficar assim, com algumas informa\u00e7\u00f5es b\u00e1sicas sobre os tr\u00eas primeiros filmes de Star Wars:<\/li>\n<\/ol>\n<p class=\"image-container\"><img src=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-4\/img\/c4f49788ed82502b.png\" width=\"830\" height=\"671\" \/><\/p>\n<ol start=\"3\" type=\"1\">\n<li>Selecione\u00a0Ferramentas&gt; Editor de scripts\u00a0para abrir o editor de scripts.<\/li>\n<li>Clique no t\u00edtulo &#8220;Projeto sem t\u00edtulo&#8221; e altere para &#8220;Formata\u00e7\u00e3o\u00a0de dados&#8221;.<\/li>\n<li>Clique em\u00a0OK\u00a0para salvar a altera\u00e7\u00e3o do t\u00edtulo.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3 class=\"step-title\">Crie um menu personalizado<\/h3>\n<p>Voc\u00ea pode aplicar v\u00e1rios m\u00e9todos b\u00e1sicos de\u00a0formata\u00e7\u00e3o\u00a0no Apps Script \u00e0s suas planilhas.\u00a0Os exerc\u00edcios a seguir demonstram algumas maneiras de formatar dados.\u00a0Para ajudar a controlar suas a\u00e7\u00f5es de\u00a0formata\u00e7\u00e3o, vamos criar um menu personalizado com os itens de que voc\u00ea precisa.\u00a0O processo de cria\u00e7\u00e3o de menus personalizados foi descrito no\u00a0codelab\u00a0<a href=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-3\" target=\"_blank\" rel=\"noopener noreferrer\">Trabalhando com dados<\/a>\u00a0, mas vamos resumi-lo aqui novamente.<\/p>\n<p>&nbsp;<\/p>\n<h4>Implementa\u00e7\u00e3o<\/h4>\n<p>Vamos criar um menu personalizado!<\/p>\n<ol start=\"1\" type=\"1\">\n<li>No editor do Apps Script, substitua o c\u00f3digo em seu projeto de script pelo seguinte:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/**\r\n * A special function that runs when the spreadsheet is opened\r\n * or reloaded, used to add a custom menu to the spreadsheet.\r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> onOpen<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"com\">\/\/ Get the Ui object. <\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> ui <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getUi<\/span><span class=\"pun\">();<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Create and add a named menu and its items to the menu bar.<\/span><span class=\"pln\">\r\n  ui<\/span><span class=\"pun\">.<\/span><span class=\"pln\">createMenu<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Quick formats'<\/span><span class=\"pun\">)<\/span>\r\n   <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Format row header'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'formatRowHeader'<\/span><span class=\"pun\">)<\/span>\r\n   <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Format column header'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'formatColumnHeader'<\/span><span class=\"pun\">)<\/span>\r\n   <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Format dataset'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'formatDataset'<\/span><span class=\"pun\">)<\/span> \r\n  <span class=\"pun\">.<\/span><span class=\"pln\">addToUi<\/span><span class=\"pun\">();<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"2\" type=\"1\">\n<li>Salve seu projeto de script.<\/li>\n<li>No editor de script, selecione\u00a0<code>onOpen<\/code>no menu suspenso da barra de tarefas e clique no\u00a0<img title=\"Corre\" src=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-4\/img\/520b3b8ae24db874.png\" \/>bot\u00e3o.\u00a0Isso ser\u00e1 executado\u00a0<code>onOpen()<\/code>para reconstruir o menu da planilha, para que voc\u00ea n\u00e3o precise recarregar a planilha.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h4>Revis\u00e3o de c\u00f3digo<\/h4>\n<p>Vamos revisar este c\u00f3digo para entender como ele funciona.\u00a0Em\u00a0<code>onOpen()<\/code>, a primeira linha usa o\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/spreadsheet-app#getui\" target=\"_blank\" rel=\"noopener noreferrer\"><code>getUi()<\/code><\/a>m\u00e9todo para adquirir um\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/base\/ui.html\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Ui<\/code><\/a>objeto que representa a interface do usu\u00e1rio da planilha ativa \u00e0 qual este script est\u00e1 vinculado.<\/p>\n<p>As pr\u00f3ximas linhas criar um novo menu (\u00a0<code>Quick formats<\/code>), itens de menu add (\u00a0<code>Format row header<\/code>,\u00a0<code>Format column header<\/code>e\u00a0<code>Format dataset<\/code>) para esse menu, e depois adicionar o menu para a interface do planilha.\u00a0Isto \u00e9 feito com as\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/base\/ui#createmenucaption\" target=\"_blank\" rel=\"noopener noreferrer\"><code>createMenu(caption)<\/code><\/a>,\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/base\/menu#addItem(String,String)\" target=\"_blank\" rel=\"noopener noreferrer\"><code>addItem(caption, functionName)<\/code><\/a>e\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/base\/menu#addtoui\" target=\"_blank\" rel=\"noopener noreferrer\"><code>addToUi()<\/code><\/a>m\u00e9todos, respectivamente.<\/p>\n<p>O\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/base\/menu#addItem(String,String)\" target=\"_blank\" rel=\"noopener noreferrer\"><code>addItem(caption, functionName)<\/code><\/a>cria uma conex\u00e3o entre o r\u00f3tulo do item de menu e uma fun\u00e7\u00e3o Apps Script que \u00e9 executada quando esse item de menu \u00e9 selecionado.\u00a0Por exemplo, selecionar o\u00a0<code>Format row header<\/code>item de menu faz com que o Planilhas tente executar a\u00a0<code>formatRowHeader()<\/code>fun\u00e7\u00e3o (que ainda n\u00e3o existe).<\/p>\n<p>&nbsp;<\/p>\n<h4>Resultados<\/h4>\n<p>Em sua planilha, voc\u00ea pode clicar no\u00a0<code>Quick formats<\/code>menu para ver os novos itens de menu:<\/p>\n<p class=\"image-container\"><img src=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-4\/img\/1d639a41f3104864.png\" width=\"842\" height=\"217\" \/><\/p>\n<p>\u00a0 \u00a0 Clicar em qualquer um desses itens agora causar\u00e1 um erro, pois voc\u00ea ainda n\u00e3o implementou suas fun\u00e7\u00f5es correspondentes.\u00a0As pr\u00f3ximas se\u00e7\u00f5es cobrem a implementa\u00e7\u00e3o dessas fun\u00e7\u00f5es.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3 class=\"step-title\">Formate uma linha de cabe\u00e7alho<\/h3>\n<p>Os conjuntos de dados em planilhas geralmente t\u00eam linhas de cabe\u00e7alho que identificam os dados em cada coluna.\u00a0Normalmente, \u00e9 uma boa ideia formatar linhas de cabe\u00e7alho para separ\u00e1-los visualmente do restante dos dados da planilha.<\/p>\n<p>No primeiro codelab, voc\u00ea construiu uma macro para seu cabe\u00e7alho e ajustou seu c\u00f3digo.\u00a0Aqui, voc\u00ea formatar\u00e1 uma linha de cabe\u00e7alho do zero usando o Apps Script.\u00a0A linha de cabe\u00e7alho que voc\u00ea criar aqui ir\u00e1 colocar em negrito o texto do cabe\u00e7alho, colorir o fundo de um azul-esverdeado escuro, colorir o texto de branco e adicionar algumas bordas s\u00f3lidas.<\/p>\n<p>&nbsp;<\/p>\n<h4>Implementa\u00e7\u00e3o<\/h4>\n<p>Para implementar a opera\u00e7\u00e3o de\u00a0formata\u00e7\u00e3o, voc\u00ea usar\u00e1 os mesmos\u00a0m\u00e9todos de\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/\" target=\"_blank\" rel=\"noopener noreferrer\">servi\u00e7o de planilha<\/a>\u00a0usados \u200b\u200bantes, mas agora tamb\u00e9m usar\u00e1 alguns dos m\u00e9todos de\u00a0formata\u00e7\u00e3o\u00a0do servi\u00e7o.\u00a0Execute as seguintes etapas:<\/p>\n<ol start=\"1\" type=\"1\">\n<li>No editor do Apps Script, adicione a seguinte fun\u00e7\u00e3o ao final do seu projeto de script:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/**\r\n * Formats top row of the sheet using our header row style. \r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> formatRowHeader<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"com\">\/\/ Get the current active sheet and the top row's range.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> sheet <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getActiveSheet<\/span><span class=\"pun\">();<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> headerRange <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getRange<\/span><span class=\"pun\">(<\/span><span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getLastColumn<\/span><span class=\"pun\">());<\/span>\r\n \r\n  <span class=\"com\">\/\/ Apply each format to the top row: bold white text,<\/span>\r\n  <span class=\"com\">\/\/ blue-green background, and a solid black border<\/span>\r\n  <span class=\"com\">\/\/ around the cells.<\/span><span class=\"pln\">\r\n  headerRange\r\n    <\/span><span class=\"pun\">.<\/span><span class=\"pln\">setFontWeight<\/span><span class=\"pun\">(<\/span><span class=\"str\">'bold'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">setFontColor<\/span><span class=\"pun\">(<\/span><span class=\"str\">'#ffffff'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">setBackgroundColor<\/span><span class=\"pun\">(<\/span><span class=\"str\">'#007272'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">setBorder<\/span><span class=\"pun\">(<\/span>\r\n      <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span>\r\n      <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span>\r\n      <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"typ\">BorderStyle<\/span><span class=\"pun\">.<\/span><span class=\"pln\">SOLID_MEDIUM<\/span><span class=\"pun\">);<\/span>\r\n\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"2\" type=\"1\">\n<li>Salve seu projeto de script.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h4>Revis\u00e3o de c\u00f3digo<\/h4>\n<p>Como muitas tarefas de\u00a0formata\u00e7\u00e3o, o c\u00f3digo do Apps Script necess\u00e1rio para implement\u00e1-lo \u00e9 direto.\u00a0As primeiras duas linhas usam m\u00e9todos que voc\u00ea viu antes para obter uma refer\u00eancia para a planilha ativa atual (\u00a0<code>sheet<\/code>) e a linha superior da planilha (\u00a0<code>headerRange)<\/code>. O\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/sheet#getrangerow,-column,-numrows,-numcolumns\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Sheet.getRange(row, column, numRows, numColumns)<\/code><\/a>\u00a0m\u00e9todo especifica a linha superior, incluindo apenas as colunas com dados nelas. O\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/sheet#getlastcolumn\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Sheet.getLastColumn()<\/code><\/a>m\u00e9todo apenas retorna o \u00edndice da \u00faltima coluna que cont\u00e9m os dados da planilha. Em nosso exemplo, \u00e9 a coluna E (\u00a0url\u00a0).<\/p>\n<p>&nbsp;<\/p>\n<aside class=\"special\">\u00a0 \u00a0 Observa\u00e7\u00e3o\u00a0: estamos assumindo aqui que a linha de cabe\u00e7alho que queremos formatar est\u00e1 sempre na linha 1 e que nossos dados come\u00e7am em A1 e se estendem por um n\u00famero de colunas cont\u00edguas.\u00a0Isso \u00e9 bom para este exerc\u00edcio, mas na pr\u00e1tica\u00a0geral\u00a0voc\u00ea pode querer evitar essas suposi\u00e7\u00f5es permitindo que o usu\u00e1rio especifique exatamente quais c\u00e9lulas formatar (no caso de a estrutura de sua planilha ser diferente).<\/aside>\n<p>&nbsp;<\/p>\n<p>O restante do c\u00f3digo simplesmente chama v\u00e1rios\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range<\/code><\/a>\u00a0m\u00e9todos para aplicar op\u00e7\u00f5es de\u00a0formata\u00e7\u00e3o\u00a0a todas as c\u00e9lulas em\u00a0<code>headerRange<\/code>.\u00a0Para manter o c\u00f3digo f\u00e1cil de ler, voc\u00ea usa o\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Method_chaining\" target=\"_blank\" rel=\"noopener noreferrer\">encadeamento de m\u00e9todos<\/a>\u00a0para chamar cada m\u00e9todo de\u00a0formata\u00e7\u00e3o\u00a0um ap\u00f3s o outro:<\/p>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#setfontweightfontweight\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.setFontWeight(fontWeight)<\/code><\/a>\u00a0\u00e9 usado para definir a espessura da fonte para negrito.<\/li>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#setFontColor(String)\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.setFontColor(color)<\/code><\/a>\u00a0\u00e9 usado para definir a cor da fonte para branco.<\/li>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#setbackgroundcolor\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.setBackground(color)<\/code><\/a>\u00a0\u00e9 usado para definir a cor de fundo para um azul-esverdeado escuro.<\/li>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#setBorder(Boolean,Boolean,Boolean,Boolean,Boolean,Boolean,String,BorderStyle)\" target=\"_blank\" rel=\"noopener noreferrer\"><code>setBorder(top, left, bottom, right, vertical, horizontal, color, style)<\/code><\/a>\u00a0coloca uma borda preta s\u00f3lida ao redor das c\u00e9lulas do intervalo.<\/li>\n<\/ul>\n<p>O \u00faltimo m\u00e9todo tem muitos par\u00e2metros, ent\u00e3o vamos revisar o que cada um est\u00e1 fazendo.\u00a0As primeiras quatro op\u00e7\u00f5es de par\u00e2metro aqui (todas definidas como\u00a0<code>true<\/code>) informam ao Apps Script que a borda deve ser adicionada acima, abaixo e \u00e0 esquerda e \u00e0 direita do intervalo.\u00a0O quinto e o sexto par\u00e2metros (\u00a0<code>null<\/code>e\u00a0<code>null<\/code>) direcionam o Apps Script para evitar a altera\u00e7\u00e3o de quaisquer linhas de fronteira que estejam dentro do intervalo selecionado.\u00a0O s\u00e9timo par\u00e2metro (\u00a0<code>null<\/code>) indica que a cor da borda deve ser preto por padr\u00e3o.\u00a0Finalmente, o \u00faltimo par\u00e2metro indica o tipo de estilo de borda a usar, tirado das op\u00e7\u00f5es fornecidas por\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/border-style\" target=\"_blank\" rel=\"noopener noreferrer\"><code>SpreadsheetApp.BorderStyle<\/code><\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h4>Resultados<\/h4>\n<p>Voc\u00ea pode ver sua fun\u00e7\u00e3o de\u00a0formata\u00e7\u00e3o\u00a0em a\u00e7\u00e3o fazendo o seguinte:<\/p>\n<ol start=\"1\" type=\"1\">\n<li>Salve seu projeto de script no editor do Apps Script, caso ainda n\u00e3o tenha feito isso.<\/li>\n<li>Clique no\u00a0item de menu\u00a0Formatos r\u00e1pidos&gt; Formato da linha de cabe\u00e7alho\u00a0.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<aside class=\"warning\">\u00a0 \u00a0 Observa\u00e7\u00e3o:\u00a0se voc\u00ea estiver usando uma\u00a0conta\u00a0<a href=\"http:\/\/gmail.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">gmail.com<\/a>\u00a0, poder\u00e1 ver uma caixa de di\u00e1logo &#8220;Este aplicativo n\u00e3o foi verificado&#8221; ao usar o script pela primeira vez.\u00a0O Google usa isso para avisar os usu\u00e1rios que podem estar usando c\u00f3digo de autores desconhecidos ou n\u00e3o confi\u00e1veis.\u00a0Se voc\u00ea vir esta caixa de di\u00e1logo, n\u00e3o h\u00e1 problema em continuar, pois voc\u00ea \u00e9 o autor do script.\u00a0Nesses casos, continue autorizando o script fazendo o seguinte:<\/p>\n<ol start=\"1\" type=\"1\">\n<li>Na caixa de di\u00e1logo &#8220;Este aplicativo n\u00e3o foi verificado&#8221;, clique em\u00a0Avan\u00e7ado\u00a0.<\/li>\n<li>Clique em\u00a0Ir para\u00a0formata\u00e7\u00e3o\u00a0de dados (inseguro).<\/li>\n<li>Na pr\u00f3xima tela, clique em\u00a0Permitir\u00a0.<\/li>\n<\/ol>\n<p>Ao longo deste codelab, voc\u00ea ver\u00e1 um ou mais prompts de permiss\u00e3o.\u00a0Siga as instru\u00e7\u00f5es na tela para continuar autorizando o c\u00f3digo.\u00a0Voc\u00ea pode ler mais sobre esse processo no\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/guides\/services\/authorization\" target=\"_blank\" rel=\"noopener noreferrer\">guia de autoriza\u00e7\u00e3o<\/a>\u00a0do\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/guides\/services\/authorization\" target=\"_blank\" rel=\"noopener noreferrer\">Apps Script<\/a>\u00a0.<\/p>\n<\/aside>\n<p>&nbsp;<\/p>\n<p>Os resultados devem ser semelhantes aos seguintes:<\/p>\n<p class=\"image-container\"><img src=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-4\/img\/a1a63770c2c3becc.gif\" width=\"828\" height=\"256\" \/><\/p>\n<p>\u00a0 \u00a0 Voc\u00ea automatizou uma tarefa de\u00a0formata\u00e7\u00e3o!\u00a0A pr\u00f3xima se\u00e7\u00e3o aplica a mesma t\u00e9cnica para criar um estilo de formato diferente para cabe\u00e7alhos de coluna.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Formate um cabe\u00e7alho de coluna<\/p>\n<p>Se voc\u00ea pode fazer um cabe\u00e7alho de linha personalizado, voc\u00ea tamb\u00e9m pode fazer um cabe\u00e7alho de coluna!\u00a0Os cabe\u00e7alhos das colunas aumentam a legibilidade para determinados conjuntos de dados.\u00a0Por exemplo, a\u00a0coluna de\u00a0t\u00edtulos\u00a0nesta planilha pode ser aprimorada com as seguintes op\u00e7\u00f5es de formato:<\/p>\n<ul>\n<li>A negrito do texto<\/li>\n<li>It\u00e1lico no texto<\/li>\n<li>Adicionando bordas de c\u00e9lulas<\/li>\n<li>Inserindo hiperlinks, usando o\u00a0conte\u00fado da coluna\u00a0url\u00a0.\u00a0Depois de adicionar esses hiperlinks, voc\u00ea pode remover a\u00a0coluna\u00a0url\u00a0para ajudar a limpar a planilha.<\/li>\n<\/ul>\n<p>Agora voc\u00ea implementar\u00e1 uma\u00a0<code>formatColumnHeader()<\/code>\u00a0fun\u00e7\u00e3o para aplicar essas altera\u00e7\u00f5es \u00e0 primeira coluna da planilha!\u00a0Para ajudar a tornar o c\u00f3digo um pouco mais f\u00e1cil de ler, voc\u00ea tamb\u00e9m implementar\u00e1 duas fun\u00e7\u00f5es auxiliares.<\/p>\n<p>&nbsp;<\/p>\n<h4>Implementa\u00e7\u00e3o<\/h4>\n<p>Como antes, aqui voc\u00ea s\u00f3 precisa adicionar uma fun\u00e7\u00e3o para automatizar a\u00a0formata\u00e7\u00e3o\u00a0do cabe\u00e7alho da coluna.\u00a0Execute as seguintes etapas:<\/p>\n<ol start=\"1\" type=\"1\">\n<li>No editor do Apps Script, adicione a seguinte\u00a0<code>formatColumnHeader()<\/code>\u00a0fun\u00e7\u00e3o ao final do seu projeto de script:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/**\r\n * Formats the column header of the active sheet.\r\n *\/<\/span> \r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> formatColumnHeader<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>  \r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> sheet <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getActiveSheet<\/span><span class=\"pun\">();<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Get total number of rows in data range, not including<\/span>\r\n  <span class=\"com\">\/\/ the header row.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> numRows <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getDataRange<\/span><span class=\"pun\">().<\/span><span class=\"pln\">getLastRow<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">-<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">;<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Get the range of the column header. <\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> columnHeaderRange <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getRange<\/span><span class=\"pun\">(<\/span><span class=\"lit\">2<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> numRows<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">);<\/span> \r\n  \r\n  <span class=\"com\">\/\/ Apply text formatting and add borders.<\/span><span class=\"pln\">\r\n  columnHeaderRange\r\n    <\/span><span class=\"pun\">.<\/span><span class=\"pln\">setFontWeight<\/span><span class=\"pun\">(<\/span><span class=\"str\">'bold'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">setFontStyle<\/span><span class=\"pun\">(<\/span><span class=\"str\">'italic'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">setBorder<\/span><span class=\"pun\">(<\/span>\r\n      <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span>\r\n      <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span>\r\n      <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"typ\">BorderStyle<\/span><span class=\"pun\">.<\/span><span class=\"pln\">SOLID_MEDIUM<\/span><span class=\"pun\">);<\/span>\r\n \r\n  <span class=\"com\">\/\/ Call helper method to hyperlink the first column contents<\/span>\r\n  <span class=\"com\">\/\/ to the url column contents.<\/span><span class=\"pln\">\r\n  hyperlinkColumnHeaders_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">columnHeaderRange<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> numRows<\/span><span class=\"pun\">);<\/span> \r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"2\" type=\"1\">\n<li>Adicione tamb\u00e9m as seguintes fun\u00e7\u00f5es auxiliares ao final do seu projeto de script, ap\u00f3s a\u00a0<code>formatColumnHeader()<\/code>fun\u00e7\u00e3o:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/**\r\n * Helper function that hyperlinks the column header with the\r\n * 'url' contents. The function then removes the url column.\r\n *\r\n * @param {object} headerRange The range of the column header\r\n *   to update.\r\n * @param {number} numRows The size of the column header.\r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> hyperlinkColumnHeaders_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">headerRange<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> numRows<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"com\">\/\/ Get header and url column indices.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> headerColIndex <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">;<\/span> \r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> urlColIndex <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> columnIndexOf_<\/span><span class=\"pun\">(<\/span><span class=\"str\">'url'<\/span><span class=\"pun\">);<\/span>  \r\n  \r\n  <span class=\"com\">\/\/ Exit if the url column is missing. <\/span>\r\n  <span class=\"kwd\">if<\/span><span class=\"pun\">(<\/span><span class=\"pln\">urlColIndex <\/span><span class=\"pun\">==<\/span> <span class=\"pun\">-<\/span><span class=\"lit\">1<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"kwd\">return<\/span><span class=\"pun\">;<\/span> \r\n  \r\n  <span class=\"com\">\/\/ Get header and url cell values.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> urlRange <\/span><span class=\"pun\">=<\/span><span class=\"pln\">\r\n    headerRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">offset<\/span><span class=\"pun\">(<\/span><span class=\"lit\">0<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> urlColIndex <\/span><span class=\"pun\">-<\/span><span class=\"pln\"> headerColIndex<\/span><span class=\"pun\">);<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> headerValues <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> headerRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getValues<\/span><span class=\"pun\">();<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> urlValues <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> urlRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getValues<\/span><span class=\"pun\">();<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Updates header values to the hyperlinked header values. <\/span>\r\n  <span class=\"kwd\">for<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> row <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> row <\/span><span class=\"pun\">&lt;<\/span><span class=\"pln\"> numRows<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> row<\/span><span class=\"pun\">++){<\/span><span class=\"pln\">\r\n    headerValues<\/span><span class=\"pun\">[<\/span><span class=\"pln\">row<\/span><span class=\"pun\">][<\/span><span class=\"lit\">0<\/span><span class=\"pun\">]<\/span> <span class=\"pun\">=<\/span> <span class=\"str\">'=HYPERLINK(\"'<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> urlValues<\/span><span class=\"pun\">[<\/span><span class=\"pln\">row<\/span><span class=\"pun\">]<\/span>\r\n      <span class=\"pun\">+<\/span> <span class=\"str\">'\",\"'<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> headerValues<\/span><span class=\"pun\">[<\/span><span class=\"pln\">row<\/span><span class=\"pun\">]<\/span> <span class=\"pun\">+<\/span> <span class=\"str\">'\")'<\/span><span class=\"pun\">;<\/span> \r\n  <span class=\"pun\">}<\/span><span class=\"pln\">\r\n  headerRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">setValues<\/span><span class=\"pun\">(<\/span><span class=\"pln\">headerValues<\/span><span class=\"pun\">);<\/span> \r\n  \r\n  <span class=\"com\">\/\/ Delete the url column to clean up the sheet.<\/span>\r\n  <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getActiveSheet<\/span><span class=\"pun\">().<\/span><span class=\"pln\">deleteColumn<\/span><span class=\"pun\">(<\/span><span class=\"pln\">urlColIndex<\/span><span class=\"pun\">);<\/span> \r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"com\">\/**\r\n * Helper function that goes through the header of all the columns \r\n * and returns the index of the column with the specified name\r\n * in row 1. If a column with that name does not exist,\r\n * this function returns -1. If multiple columns have the same\r\n * name in row 1, the index of the first one discovered is\r\n * returned.\r\n * \r\n * @param {string} colName The name to look for in the column\r\n *   headers. \r\n * @return The index of that column in the active sheet,\r\n *   or -1 if the name isn't found.\r\n *\/<\/span> \r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> columnIndexOf_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">colName<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"com\">\/\/ Get the current column names.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> sheet <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getActiveSheet<\/span><span class=\"pun\">();<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> columnHeaders <\/span><span class=\"pun\">=<\/span><span class=\"pln\">\r\n    sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getRange<\/span><span class=\"pun\">(<\/span><span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getLastColumn<\/span><span class=\"pun\">());<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> columnNames <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> columnHeaders<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getValues<\/span><span class=\"pun\">();<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Loops through every column and returns the column index<\/span>\r\n  <span class=\"com\">\/\/ if the row 1 value of that column matches colName.<\/span>\r\n  <span class=\"kwd\">for<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> col <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> col <\/span><span class=\"pun\">&lt;=<\/span><span class=\"pln\"> columnNames<\/span><span class=\"pun\">[<\/span><span class=\"lit\">0<\/span><span class=\"pun\">].<\/span><span class=\"pln\">length<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> col<\/span><span class=\"pun\">++)<\/span>\r\n  <span class=\"pun\">{<\/span>\r\n    <span class=\"kwd\">if<\/span><span class=\"pun\">(<\/span><span class=\"pln\">columnNames<\/span><span class=\"pun\">[<\/span><span class=\"lit\">0<\/span><span class=\"pun\">][<\/span><span class=\"pln\">col<\/span><span class=\"pun\">-<\/span><span class=\"lit\">1<\/span><span class=\"pun\">]<\/span> <span class=\"pun\">===<\/span><span class=\"pln\"> colName<\/span><span class=\"pun\">)<\/span>\r\n      <span class=\"kwd\">return<\/span><span class=\"pln\"> col<\/span><span class=\"pun\">;<\/span> \r\n  <span class=\"pun\">}<\/span>\r\n\r\n  <span class=\"com\">\/\/ Returns -1 if a column named colName does not exist. <\/span>\r\n  <span class=\"kwd\">return<\/span> <span class=\"pun\">-<\/span><span class=\"lit\">1<\/span><span class=\"pun\">;<\/span> \r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"3\" type=\"1\">\n<li>Salve seu projeto de script.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h4>Revis\u00e3o de c\u00f3digo<\/h4>\n<p>Vamos revisar o c\u00f3digo em cada uma dessas tr\u00eas fun\u00e7\u00f5es separadamente:<\/p>\n<h3><code>formatColumnHeader()<\/code><\/h3>\n<p>Como voc\u00ea provavelmente deve esperar, as primeiras linhas desta fun\u00e7\u00e3o definem vari\u00e1veis \u200b\u200bque fazem refer\u00eancia \u00e0 planilha e ao intervalo em que estamos interessados:<\/p>\n<ul>\n<li>A planilha ativa \u00e9 armazenada em\u00a0<code>sheet<\/code>.<\/li>\n<li>O n\u00famero de linhas no cabe\u00e7alho da coluna \u00e9 calculado e salvo em\u00a0<code>numRows<\/code>.\u00a0Aqui os subtrai c\u00f3digo de um modo que a contagem de linha n\u00e3o inclui o cabe\u00e7alho da coluna:\u00a0<code>title<\/code>.<\/li>\n<li>O intervalo que cobre o cabe\u00e7alho da coluna \u00e9 armazenado em\u00a0<code>columnHeaderRange<\/code>.<\/li>\n<\/ul>\n<p>O c\u00f3digo ent\u00e3o aplica as bordas e o negrito ao intervalo do cabe\u00e7alho da coluna, basta inserir\u00a0<code>formatRowHeader()<\/code>.\u00a0Aqui,\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#setfontstylefontstyle\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.setFontStyle(fontStyle)<\/code><\/a>\u00a0tamb\u00e9m \u00e9 usado para deixar o texto em it\u00e1lico.<\/p>\n<p>Obter os hiperlinks adicionados \u00e0 coluna do cabe\u00e7alho \u00e9 mais complexo, portanto,\u00a0<code>formatColumnHeader()<\/code>\u00a0chamadas\u00a0<code>hyperlinkColumnHeaders_(headerRange, numRows)<\/code>\u00a0para cuidar dessa tarefa.\u00a0Isso ajuda a manter o c\u00f3digo organizado e leg\u00edvel.<\/p>\n<h3><code>hyperlinkColumnHeaders_(headerRange, numRows)<\/code><\/h3>\n<p>Esta fun\u00e7\u00e3o identifica primeiro os \u00edndices da coluna do cabe\u00e7alho (assumido como sendo o \u00edndice 1) e a\u00a0<code>url<\/code>\u00a0coluna.\u00a0Ele chama\u00a0<code>columnIndexOf_('url')<\/code>\u00a0para obter o \u00edndice da coluna url.\u00a0Se uma\u00a0<code>url<\/code>\u00a0coluna n\u00e3o for encontrada, o m\u00e9todo sai sem modificar nenhum dado.<\/p>\n<p>A fun\u00e7\u00e3o obt\u00e9m um novo intervalo (\u00a0<code>urlRange<\/code>) que cobre os urls correspondentes \u00e0s linhas da coluna do cabe\u00e7alho.\u00a0Isso \u00e9 feito com o\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#offsetrowoffset,-columnoffset\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.offset(rowOffset, columnOffset)<\/code><\/a>\u00a0m\u00e9todo, que garante que as duas faixas sejam do mesmo tamanho.\u00a0Os valores de\u00a0<code>headerColumn<\/code>\u00a0e da\u00a0<code>url<\/code>\u00a0coluna s\u00e3o ent\u00e3o recuperados (\u00a0<code>headerValues<\/code>e\u00a0<code>urlValues<\/code>, respectivamente).<\/p>\n<p>A fun\u00e7\u00e3o ent\u00e3o percorre cada valor de c\u00e9lula de cabe\u00e7alho de coluna e o substitui por uma\u00a0<code>=HYPERLINK()<\/code>\u00a0f\u00f3rmula do Planilhas constru\u00edda com o cabe\u00e7alho e o\u00a0<code>url<\/code>\u00a0conte\u00fado da coluna.\u00a0Os valores de cabe\u00e7alho modificados s\u00e3o ent\u00e3o empurrados para tr\u00e1s na folha usando\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#setvaluesvalues\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.setValues(values)<\/code><\/a>.<\/p>\n<p>Por fim, para ajudar a manter a folha limpa e remover informa\u00e7\u00f5es redundantes,\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/sheet#deletecolumncolumnposition\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Sheet.deleteColumn(columnPosition)<\/code><\/a>\u00a0\u00e9 chamado para remover a\u00a0<code>url<\/code>\u00a0coluna.<\/p>\n<h3><code>columnIndexOf_(colName)<\/code><\/h3>\n<p>Essa fun\u00e7\u00e3o auxiliar \u00e9 apenas uma fun\u00e7\u00e3o de utilidade simples que pesquisa um nome espec\u00edfico na primeira linha da planilha.\u00a0As primeiras tr\u00eas linhas usam m\u00e9todos que voc\u00ea j\u00e1 viu para obter uma lista de nomes de cabe\u00e7alhos de coluna da linha 1 da planilha.\u00a0Esses nomes s\u00e3o armazenados na vari\u00e1vel columnNames.<\/p>\n<p>A fun\u00e7\u00e3o ent\u00e3o examina cada nome em ordem.\u00a0Se encontrar um que corresponda ao nome que est\u00e1 sendo procurado, ele para e retorna o \u00edndice dessa coluna.\u00a0Se chegar ao final da lista de nomes sem encontrar o nome, retorna -1 para sinalizar que o nome n\u00e3o foi encontrado.<\/p>\n<h4><\/h4>\n<h4>Resultados<\/h4>\n<p>Voc\u00ea pode ver sua fun\u00e7\u00e3o de\u00a0formata\u00e7\u00e3o\u00a0em a\u00e7\u00e3o fazendo o seguinte:<\/p>\n<ol start=\"1\" type=\"1\">\n<li>Salve seu projeto de script no editor do Apps Script, caso ainda n\u00e3o tenha feito isso.<\/li>\n<li>Clique no\u00a0item de menu\u00a0Formatos r\u00e1pidos&gt; Formatar cabe\u00e7alho da coluna\u00a0.<\/li>\n<\/ol>\n<p>Os resultados devem ser semelhantes aos seguintes:<\/p>\n<p class=\"image-container\"><img src=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-4\/img\/7497cf1b982aeff6.gif\" width=\"827\" height=\"256\" \/><\/p>\n<p>\u00a0 \u00a0 Voc\u00ea automatizou outra tarefa de\u00a0formata\u00e7\u00e3o!\u00a0Agora que os cabe\u00e7alhos de coluna e linha est\u00e3o formatados, a pr\u00f3xima se\u00e7\u00e3o mostrar\u00e1 como formatar os pr\u00f3prios dados.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Formate seu conjunto de dados<\/p>\n<p>Agora que voc\u00ea tem cabe\u00e7alhos, vamos criar uma fun\u00e7\u00e3o que formate o restante dos dados em sua planilha.\u00a0Usaremos as seguintes op\u00e7\u00f5es de\u00a0formata\u00e7\u00e3o:<\/p>\n<ul>\n<li>Cores de fundo de linha alternadas (conhecidas como\u00a0<em>faixas<\/em>\u00a0)<\/li>\n<li>Alterando formatos de data.<\/li>\n<li>Aplicando bordas.<\/li>\n<li>Dimensionamento autom\u00e1tico de todas as colunas e linhas.<\/li>\n<\/ul>\n<p>Agora voc\u00ea criar\u00e1 uma fun\u00e7\u00e3o\u00a0<code>formatDataset()<\/code>\u00a0e um m\u00e9todo auxiliar adicional que pode aplicar esses formatos aos dados da planilha.<\/p>\n<h4><\/h4>\n<h4>Implementa\u00e7\u00e3o<\/h4>\n<p>Como antes, aqui voc\u00ea s\u00f3 precisa adicionar uma fun\u00e7\u00e3o para automatizar a\u00a0formata\u00e7\u00e3o\u00a0dos dados.\u00a0Execute as seguintes etapas:<\/p>\n<ol start=\"1\" type=\"1\">\n<li>No editor do Apps Script, adicione a seguinte\u00a0<code>formatDataset()<\/code>\u00a0fun\u00e7\u00e3o ao final do seu projeto de script:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/**\r\n * Formats the sheet data, excluding the header row and column.\r\n * Applies a border and banding, formats the 'release_date'\r\n * column, and auto-sizes the rows and columns.\r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> formatDataset<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"com\">\/\/ Get the active sheet and data range.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> sheet <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getActiveSheet<\/span><span class=\"pun\">();<\/span> \r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> fullDataRange <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getDataRange<\/span><span class=\"pun\">();<\/span>\r\n\r\n  <span class=\"com\">\/\/ Apply row banding to the data, excluding the header<\/span>\r\n  <span class=\"com\">\/\/ row and column. Only apply the banding if the range<\/span>\r\n  <span class=\"com\">\/\/ doesn't already have a banding set.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> noHeadersRange <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> fullDataRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">offset<\/span><span class=\"pun\">(<\/span>\r\n    <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\">\r\n    fullDataRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getNumRows<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">-<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\">\r\n    fullDataRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getNumColumns<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">-<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">);<\/span>\r\n\r\n  <span class=\"kwd\">if<\/span> <span class=\"pun\">(!<\/span><span class=\"pln\"> noHeadersRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getBandings<\/span><span class=\"pun\">()[<\/span><span class=\"lit\">0<\/span><span class=\"pun\">])<\/span> <span class=\"pun\">{<\/span>\r\n    <span class=\"com\">\/\/ The range doesn't already have a banding, so it's<\/span>\r\n    <span class=\"com\">\/\/ safe to apply a new one.<\/span><span class=\"pln\">\r\n    noHeadersRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">applyRowBanding<\/span><span class=\"pun\">(<\/span>\r\n      <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"typ\">BandingTheme<\/span><span class=\"pun\">.<\/span><span class=\"pln\">LIGHT_GREY<\/span><span class=\"pun\">,<\/span>\r\n      <span class=\"kwd\">false<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">false<\/span><span class=\"pun\">);<\/span>\r\n  <span class=\"pun\">}<\/span>\r\n\r\n  <span class=\"com\">\/\/ Call a helper function to apply a date formatting<\/span>\r\n  <span class=\"com\">\/\/ to a column labeled as 'release_date'.<\/span><span class=\"pln\">\r\n  formatDates_<\/span><span class=\"pun\">(<\/span><span class=\"pln\"> columnIndexOf_<\/span><span class=\"pun\">(<\/span><span class=\"str\">'release_date'<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">);<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Set a border around all the data, and resize the<\/span>\r\n  <span class=\"com\">\/\/ columns and rows to fit.<\/span><span class=\"pln\">\r\n  fullDataRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">setBorder<\/span><span class=\"pun\">(<\/span>\r\n    <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span>\r\n    <span class=\"kwd\">null<\/span><span class=\"pun\">,<\/span>\r\n    <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"typ\">BorderStyle<\/span><span class=\"pun\">.<\/span><span class=\"pln\">SOLID_MEDIUM<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n\r\n  sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">autoResizeColumns<\/span><span class=\"pun\">(<\/span><span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> fullDataRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getNumColumns<\/span><span class=\"pun\">());<\/span><span class=\"pln\">\r\n  sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">autoResizeRows<\/span><span class=\"pun\">(<\/span><span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> fullDataRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getNumRows<\/span><span class=\"pun\">());<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"2\" type=\"1\">\n<li>Al\u00e9m disso, adicione a seguinte fun\u00e7\u00e3o auxiliar no final do seu projeto de script, ap\u00f3s a\u00a0<code>formatDataset()<\/code>fun\u00e7\u00e3o:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/** \r\n * Helper method that applies a\r\n * \"Month Day, Year (Day of Week)\" date format to the\r\n * indicated column in the active sheet. \r\n *\r\n * @param {number} colIndex The column index of the column\r\n *   to format.\r\n *\/<\/span> \r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> formatDates_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">colIndex<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"com\">\/\/ Exit if the given column index is -1, indicating<\/span>\r\n  <span class=\"com\">\/\/ the column to format isn't present in the sheet.<\/span>\r\n  <span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">colIndex <\/span><span class=\"pun\">&lt;<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"kwd\">return<\/span><span class=\"pun\">;<\/span> \r\n\r\n  <span class=\"com\">\/\/ Set the date formatting for the date column, excluding<\/span>\r\n  <span class=\"com\">\/\/ the header row.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> sheet <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getActiveSheet<\/span><span class=\"pun\">();<\/span><span class=\"pln\">\r\n  sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getRange<\/span><span class=\"pun\">(<\/span><span class=\"lit\">2<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> colIndex<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getLastRow<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">-<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">setNumberFormat<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"mmmm dd, yyyy (dddd)\"<\/span><span class=\"pun\">);<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"3\" type=\"1\">\n<li>Salve seu projeto de script.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h4>Revis\u00e3o de c\u00f3digo<\/h4>\n<p>Vamos revisar o c\u00f3digo em cada uma dessas duas fun\u00e7\u00f5es separadamente:<\/p>\n<h2><code>formatDataset()<\/code><\/h2>\n<p>Esta fun\u00e7\u00e3o segue um padr\u00e3o semelhante \u00e0s fun\u00e7\u00f5es de formato anteriores que voc\u00ea j\u00e1 implementou.\u00a0Primeiro, ele obt\u00e9m vari\u00e1veis \u200b\u200bpara conter refer\u00eancias \u00e0 planilha ativa (planilha) e ao intervalo de dados (fullDataRange).<\/p>\n<p>Em segundo lugar, ele usa o\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#offsetrowoffset,-columnoffset,-numrows,-numcolumns\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.offset(rowOffset, columnOffset, numRows, numColumns)<\/code><\/a>\u00a0m\u00e9todo para criar um novo intervalo (\u00a0<code>noHeadersRange<\/code>) que cobre todos os dados da planilha, excluindo os cabe\u00e7alhos de coluna e linha.\u00a0O c\u00f3digo ent\u00e3o verifica se este novo intervalo possui alguma faixa existente (usando\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#getbandings\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.getBandings()<\/code><\/a>).\u00a0Isso \u00e9 necess\u00e1rio porque o Apps Script gerar\u00e1 um erro se voc\u00ea tentar aplicar uma nova faixa onde j\u00e1 existe uma.\u00a0Se uma faixa ainda n\u00e3o existir, a fun\u00e7\u00e3o adiciona uma faixa cinza claro usando\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#applyrowbandingbandingtheme,-showheader,-showfooter\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.applyRowBanding(bandingTheme, showHeader, showFooter)<\/code><\/a>.\u00a0Caso contr\u00e1rio, a fun\u00e7\u00e3o passa para a pr\u00f3xima etapa.<\/p>\n<p>A pr\u00f3xima etapa chama a\u00a0<code>formatDates_(colIndex)<\/code>\u00a0fun\u00e7\u00e3o para formatar as datas na coluna rotulada &#8216;\u00a0<code>release_date<\/code>&#8216; (descrita abaixo).\u00a0A coluna \u00e9 especificada usando a\u00a0<code>columnIndexOf_(colName)<\/code>\u00a0fun\u00e7\u00e3o auxiliar que voc\u00ea implementou anteriormente.<\/p>\n<p>Finalmente, a\u00a0formata\u00e7\u00e3o\u00a0\u00e9 finalizada adicionando outra borda (como antes) e redimensionando automaticamente cada linha e coluna para ajustar os dados que elas cont\u00eam usando os\u00a0m\u00e9todos\u00a0e\u00a0.<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/sheet#autoresizecolumncolumnposition\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Sheet.autoResizeColumns(columnPosition)<\/code><\/a><em>\u00a0<\/em><a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/sheet#autoresizerowcolumnposition\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Sheet.autoResizeColumns(columnPosition)<\/code><\/a><\/p>\n<h2><code>formatDates_(colIndex)<\/code><\/h2>\n<p>Esta fun\u00e7\u00e3o auxiliar aplica um formato de data espec\u00edfico a uma coluna indicada pelo \u00edndice de coluna fornecido.\u00a0Especificamente, ele formata os valores de data como &#8220;M\u00eas, Dia, Ano (Dia da Semana)&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<aside class=\"special\">\u00a0 \u00a0 Nota\u00a0: Existem muitos formatos diferentes de data e n\u00famero que voc\u00ea pode usar em seus scripts e planilhas.\u00a0Consulte o\u00a0guia de\u00a0<a href=\"https:\/\/developers.google.com\/sheets\/api\/guides\/formats\" target=\"_blank\" rel=\"noopener noreferrer\">formatos de data e n\u00famero<\/a>\u00a0para obter mais informa\u00e7\u00f5es.<\/aside>\n<p>&nbsp;<\/p>\n<p>Primeiro, a fun\u00e7\u00e3o verifica se o \u00edndice da coluna fornecido \u00e9 v\u00e1lido (ou seja, 0 ou maior).\u00a0Caso contr\u00e1rio, ele retorna sem fazer mais nada.\u00a0Esta verifica\u00e7\u00e3o evita erros que podem ser causados \u200b\u200bse, por exemplo, a planilha n\u00e3o tiver uma\u00a0<code>release_date<\/code>\u00a0coluna\u00a0&#8216;\u00a0&#8216;.<\/p>\n<p>Depois que o \u00edndice da coluna \u00e9 validado, a fun\u00e7\u00e3o obt\u00e9m o intervalo que cobre essa coluna (excluindo sua linha de cabe\u00e7alho) e usa\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range#setnumberformatnumberformat\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range.setNumberFormat(numberFormat)<\/code><\/a>\u00a0para aplicar a\u00a0formata\u00e7\u00e3o.<\/p>\n<p>&nbsp;<\/p>\n<h4>Resultados<\/h4>\n<p>Voc\u00ea pode ver sua fun\u00e7\u00e3o de\u00a0formata\u00e7\u00e3o\u00a0em a\u00e7\u00e3o fazendo o seguinte:<\/p>\n<ol start=\"1\" type=\"1\">\n<li>Salve seu projeto de script no editor do Apps Script, caso ainda n\u00e3o tenha feito isso.<\/li>\n<li>Clique no\u00a0item de menu\u00a0Formatos r\u00e1pidos&gt; Formatar conjunto de dados\u00a0.<\/li>\n<\/ol>\n<p>Os resultados devem ser semelhantes aos seguintes:<\/p>\n<p class=\"image-container\"><img src=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-4\/img\/3cfedd78b3e25f3a.gif\" width=\"831\" height=\"257\" \/><\/p>\n<p>\u00a0 \u00a0 Voc\u00ea automatizou mais uma tarefa de\u00a0formata\u00e7\u00e3o!\u00a0Agora que voc\u00ea tem esses comandos de\u00a0formata\u00e7\u00e3o\u00a0dispon\u00edveis, vamos adicionar mais um monte de dados para aplic\u00e1-los!<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3 class=\"step-title\">Buscar e formatar dados da API<\/h3>\n<p>At\u00e9 agora, neste codelab, voc\u00ea viu como pode usar o Apps Script como um meio alternativo de formatar sua planilha.\u00a0Em seguida, voc\u00ea escrever\u00e1 o c\u00f3digo que extrai dados de uma API p\u00fablica, coloca esses dados em sua planilha e formata-os de maneira adequada para que sejam mais leg\u00edveis!<\/p>\n<p>No \u00faltimo codelab, voc\u00ea aprendeu como extrair dados de uma API.\u00a0Voc\u00ea usar\u00e1 as mesmas t\u00e9cnicas aqui.\u00a0Neste exerc\u00edcio, voc\u00ea usar\u00e1 a\u00a0<a href=\"https:\/\/swapi.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">API<\/a>\u00a0p\u00fablica de\u00a0<a href=\"https:\/\/swapi.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">Star Wars<\/a><a href=\"https:\/\/swapi.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00a0(\u00a0<\/a><a href=\"https:\/\/swapi.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">SWAPI<\/a><a href=\"https:\/\/swapi.dev\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00a0)<\/a>\u00a0para recuperar informa\u00e7\u00f5es para preencher sua planilha.\u00a0Especificamente, voc\u00ea usar\u00e1 a API para obter muitas informa\u00e7\u00f5es sobre os personagens principais que aparecem em cada um dos tr\u00eas filmes originais de Star Wars.<\/p>\n<p>Seu c\u00f3digo ir\u00e1 chamar a API para obter uma grande quantidade de dados JSON, analisar a resposta, colocar os dados em uma nova planilha e, em seguida, formatar essa planilha.<\/p>\n<p>&nbsp;<\/p>\n<h4>Implementa\u00e7\u00e3o<\/h4>\n<p>Nesta se\u00e7\u00e3o, voc\u00ea adicionar\u00e1 alguns itens de menu adicionais.\u00a0Cada item de menu chamar\u00e1 um script de inv\u00f3lucro que apenas passa vari\u00e1veis \u200b\u200bespec\u00edficas do item para a fun\u00e7\u00e3o principal (createResourceSheet_ ()).\u00a0Voc\u00ea implementar\u00e1 esta fun\u00e7\u00e3o e tr\u00eas fun\u00e7\u00f5es auxiliares adicionais.\u00a0Como antes, as fun\u00e7\u00f5es auxiliares ajudam a isolar partes logicamente compartimentadas da tarefa e ajudam a manter o c\u00f3digo leg\u00edvel.<\/p>\n<p>Realize as seguintes a\u00e7\u00f5es:<\/p>\n<ol start=\"1\" type=\"1\">\n<li>No editor do Apps Script, atualize sua\u00a0<code>onOpen()<\/code>\u00a0fun\u00e7\u00e3o em seu projeto de script para corresponder ao seguinte:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/**\r\n * A special function that runs when the spreadsheet is opened\r\n * or reloaded, used to add a custom menu to the spreadsheet.\r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> onOpen<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"com\">\/\/ Get the Ui object. <\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> ui <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getUi<\/span><span class=\"pun\">();<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Create and add a named menu and its items to the menu bar.<\/span><span class=\"pln\">\r\n  ui<\/span><span class=\"pun\">.<\/span><span class=\"pln\">createMenu<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Quick formats'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Format row header'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'formatRowHeader'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Format column header'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'formatColumnHeader'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Format dataset'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'formatDataset'<\/span><span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">addSeparator<\/span><span class=\"pun\">()<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">addSubMenu<\/span><span class=\"pun\">(<\/span><span class=\"pln\">ui<\/span><span class=\"pun\">.<\/span><span class=\"pln\">createMenu<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Create character sheet'<\/span><span class=\"pun\">)<\/span>\r\n                <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Episode IV'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'createPeopleSheetIV'<\/span><span class=\"pun\">)<\/span>\r\n                <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Episode V'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'createPeopleSheetV'<\/span><span class=\"pun\">)<\/span>\r\n                <span class=\"pun\">.<\/span><span class=\"pln\">addItem<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Episode VI'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'createPeopleSheetVI'<\/span><span class=\"pun\">)<\/span>\r\n                <span class=\"pun\">)<\/span>\r\n    <span class=\"pun\">.<\/span><span class=\"pln\">addToUi<\/span><span class=\"pun\">();<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"2\" type=\"1\">\n<li>Salve seu projeto de script.<\/li>\n<li>Selecione\u00a0<code>onOpen<\/code>\u00a0no menu suspenso da barra de tarefas e clique no\u00a0<img title=\"Corre\" src=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-4\/img\/520b3b8ae24db874.png\" \/>bot\u00e3o.\u00a0Isso ser\u00e1 executado\u00a0<code>onOpen()<\/code>\u00a0para reconstruir o menu da planilha com as novas op\u00e7\u00f5es que voc\u00ea acabou de adicionar.<\/li>\n<li>Selecione\u00a0Arquivo&gt; Novo&gt; Arquivo de script\u00a0no menu do editor.\u00a0Nomeie o novo script &#8221;\u00a0API\u00a0&#8221; e clique em\u00a0OK\u00a0.<\/li>\n<li>Substitua o c\u00f3digo no novo\u00a0arquivo\u00a0API.gs\u00a0pelo seguinte:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/**\r\n * Wrapper function that passes arguments to create a\r\n * resource sheet describing the characters from Episode IV. \r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> createPeopleSheetIV<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n  createResourceSheet_<\/span><span class=\"pun\">(<\/span><span class=\"str\">'characters'<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"str\">\"IV\"<\/span><span class=\"pun\">);<\/span>\r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"com\">\/**\r\n * Wrapper function that passes arguments to create a\r\n * resource sheet describing the characters from Episode V. \r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> createPeopleSheetV<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n  createResourceSheet_<\/span><span class=\"pun\">(<\/span><span class=\"str\">'characters'<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">2<\/span><span class=\"pun\">,<\/span> <span class=\"str\">\"V\"<\/span><span class=\"pun\">);<\/span>\r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"com\">\/**\r\n * Wrapper function that passes arguments to create a\r\n * resource sheet describing the characters from Episode VI. \r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> createPeopleSheetVI<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n  createResourceSheet_<\/span><span class=\"pun\">(<\/span><span class=\"str\">'characters'<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">3<\/span><span class=\"pun\">,<\/span> <span class=\"str\">\"VI\"<\/span><span class=\"pun\">);<\/span>\r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"com\">\/** \r\n * Creates a new formatted sheet filled with user-specified\r\n * information from the Star Wars API. If the sheet with this data\r\n * already exists, the sheet is overwritten with the API\r\n * information.\r\n *\r\n * @param {string} resourceType The type of resource. \r\n * @param {number} idNumber The identification number of the film. \r\n * @param {number} episodeNumber The Star Wars episode number\r\n *   of the film.  This is only used in the sheet name.\r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> createResourceSheet_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">\r\n    resourceType<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> idNumber<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> episodeNumber<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span> \r\n  \r\n  <span class=\"com\">\/\/ Fetch the basic film data from the API. <\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> filmData <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> fetchApiResourceObject_<\/span><span class=\"pun\">(<\/span>\r\n      <span class=\"str\">\"https:\/\/swapi.co\/api\/films\/\"<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> idNumber<\/span><span class=\"pun\">);<\/span>\r\n\r\n  <span class=\"com\">\/\/ Extract the API URLs for each resource so the code can<\/span>\r\n  <span class=\"com\">\/\/ call the API to get more information about each individually.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> resourceUrls <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> filmData<\/span><span class=\"pun\">[<\/span><span class=\"pln\">resourceType<\/span><span class=\"pun\">];<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Fetch each resource from the API individually and push<\/span>\r\n  <span class=\"com\">\/\/ them into a new object list.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> resourceDataList <\/span><span class=\"pun\">=<\/span> <span class=\"pun\">[];<\/span> \r\n  <span class=\"kwd\">for<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> i <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> i <\/span><span class=\"pun\">&lt;<\/span><span class=\"pln\"> resourceUrls<\/span><span class=\"pun\">.<\/span><span class=\"pln\">length<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> i<\/span><span class=\"pun\">++){<\/span><span class=\"pln\">\r\n    resourceDataList<\/span><span class=\"pun\">.<\/span><span class=\"pln\">push<\/span><span class=\"pun\">(<\/span><span class=\"pln\">\r\n      fetchApiResourceObject_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">resourceUrls<\/span><span class=\"pun\">[<\/span><span class=\"pln\">i<\/span><span class=\"pun\">])<\/span>\r\n    <span class=\"pun\">);<\/span> \r\n  <span class=\"pun\">}<\/span> \r\n  \r\n  <span class=\"com\">\/\/ Get the keys used to reference each part of data within<\/span>\r\n  <span class=\"com\">\/\/ the resources. The keys are assumed to be identical for<\/span>\r\n  <span class=\"com\">\/\/ each object since they are all the same resource type.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> resourceObjectKeys <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">Object<\/span><span class=\"pun\">.<\/span><span class=\"pln\">keys<\/span><span class=\"pun\">(<\/span><span class=\"pln\">resourceDataList<\/span><span class=\"pun\">[<\/span><span class=\"lit\">0<\/span><span class=\"pun\">]);<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Create the new sheet with an appropriate name. It<\/span>\r\n  <span class=\"com\">\/\/ automatically becomes the active sheet when it is created.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> resourceSheet <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> createNewSheet_<\/span><span class=\"pun\">(<\/span>\r\n      <span class=\"str\">\"Episode \"<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> episodeNumber <\/span><span class=\"pun\">+<\/span> <span class=\"str\">\" \"<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> resourceType<\/span><span class=\"pun\">);<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Add the API data to the new sheet, using each object<\/span>\r\n  <span class=\"com\">\/\/ key as a column header. <\/span><span class=\"pln\">\r\n  fillSheetWithData_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">resourceSheet<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> resourceObjectKeys<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> resourceDataList<\/span><span class=\"pun\">);<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Format the new sheet using the same styles the<\/span>\r\n  <span class=\"com\">\/\/ 'Quick Formats' menu items apply. These methods all<\/span>\r\n  <span class=\"com\">\/\/ act on the active sheet, which is the one just created.<\/span><span class=\"pln\">\r\n  formatRowHeader<\/span><span class=\"pun\">();<\/span><span class=\"pln\">\r\n  formatColumnHeader<\/span><span class=\"pun\">();<\/span><span class=\"pln\">   \r\n  formatDataset<\/span><span class=\"pun\">();<\/span>\r\n\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"6\" type=\"1\">\n<li>Agora voc\u00ea precisa adicionar as fun\u00e7\u00f5es auxiliares.\u00a0Adicione o seguinte c\u00f3digo ao final do\u00a0arquivo de projeto de script\u00a0API.gs\u00a0:<\/li>\n<\/ol>\n<pre><code><span class=\"com\">\/** \r\n * Helper function that retrieves a JSON object containing a\r\n * response from a public API.\r\n *\r\n * @param {string} url The URL of the API object being fetched. \r\n * @return {object} resourceObject The JSON object fetched \r\n *   from the URL request to the API. \r\n *\/<\/span>\r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> fetchApiResourceObject_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">url<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"com\">\/\/ Make request to API and get response.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> response <\/span><span class=\"pun\">=<\/span>\r\n    <span class=\"typ\">UrlFetchApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">fetch<\/span><span class=\"pun\">(<\/span><span class=\"pln\">url<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">{<\/span><span class=\"str\">'muteHttpExceptions'<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">true<\/span><span class=\"pun\">});<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Parse and return the response as a JSON object.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> json <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> response<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getContentText<\/span><span class=\"pun\">();<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> responseObject <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> JSON<\/span><span class=\"pun\">.<\/span><span class=\"pln\">parse<\/span><span class=\"pun\">(<\/span><span class=\"pln\">json<\/span><span class=\"pun\">);<\/span> \r\n  <span class=\"kwd\">return<\/span><span class=\"pln\"> responseObject<\/span><span class=\"pun\">;<\/span> \r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"com\">\/** \r\n * Helper function that creates a new sheet, or returns an existing\r\n * sheet that has the same name.\r\n *\r\n * @param {string} name The name of the new sheet. \r\n * @return {object} The newly-created sheet or existing sheet\r\n *   of the same name. This sheet becomes active.\r\n *\/<\/span> \r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> createNewSheet_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">name<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> ss <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">SpreadsheetApp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getActiveSpreadsheet<\/span><span class=\"pun\">();<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Returns an existing sheet if it has the specified<\/span>\r\n  <span class=\"com\">\/\/ name. Activates the sheet before returning.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> sheet <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> ss<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getSheetByName<\/span><span class=\"pun\">(<\/span><span class=\"pln\">name<\/span><span class=\"pun\">);<\/span>\r\n  <span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">sheet<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n    <span class=\"kwd\">return<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">activate<\/span><span class=\"pun\">();<\/span>\r\n  <span class=\"pun\">}<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Otherwise make a new sheet, set its name, and return it.<\/span>\r\n  <span class=\"com\">\/\/ New sheets created this way automatically become the active<\/span>\r\n  <span class=\"com\">\/\/ sheet.<\/span><span class=\"pln\">\r\n  sheet <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> ss<\/span><span class=\"pun\">.<\/span><span class=\"pln\">insertSheet<\/span><span class=\"pun\">(<\/span><span class=\"pln\">name<\/span><span class=\"pun\">);<\/span> \r\n  <span class=\"kwd\">return<\/span><span class=\"pln\"> sheet<\/span><span class=\"pun\">;<\/span> \r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"com\">\/** \r\n * Helper function that adds API data to the given sheet.\r\n * Each object key is used as a column header in the new sheet.\r\n *\r\n * @param {object} resourceSheet The sheet object being modified. \r\n * @param {object} objectKeys The list of keys for the resources.\r\n * @param {object} resourceDataList The list of API\r\n *   resource objects containing data to add to the sheet.\r\n *\/<\/span> \r\n<span class=\"kwd\">function<\/span><span class=\"pln\"> fillSheetWithData_<\/span><span class=\"pun\">(<\/span><span class=\"pln\">\r\n    resourceSheet<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> objectKeys<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> resourceDataList<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span> \r\n  <span class=\"com\">\/\/ Set the dimensions of the data range being added to the sheet.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> numRows <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> resourceDataList<\/span><span class=\"pun\">.<\/span><span class=\"pln\">length<\/span><span class=\"pun\">;<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> numColumns <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> objectKeys<\/span><span class=\"pun\">.<\/span><span class=\"pln\">length<\/span><span class=\"pun\">;<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Get the resource range and associated values array. Add an<\/span>\r\n  <span class=\"com\">\/\/ extra row for the column headers.<\/span>\r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> resourceRange <\/span><span class=\"pun\">=<\/span><span class=\"pln\">\r\n    resourceSheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getRange<\/span><span class=\"pun\">(<\/span><span class=\"lit\">1<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> numRows <\/span><span class=\"pun\">+<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> numColumns<\/span><span class=\"pun\">);<\/span>  \r\n  <span class=\"kwd\">var<\/span><span class=\"pln\"> resourceValues <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> resourceRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">getValues<\/span><span class=\"pun\">();<\/span> \r\n  \r\n  <span class=\"com\">\/\/ Loop over each key value and resource, extracting data to<\/span>\r\n  <span class=\"com\">\/\/ place in the 2D resourceValues array.<\/span>\r\n  <span class=\"kwd\">for<\/span> <span class=\"pun\">(<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> column <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> column <\/span><span class=\"pun\">&lt;<\/span><span class=\"pln\"> numColumns<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> column<\/span><span class=\"pun\">++)<\/span> <span class=\"pun\">{<\/span> \r\n\r\n    <span class=\"com\">\/\/ Set the column header. <\/span>\r\n    <span class=\"kwd\">var<\/span><span class=\"pln\"> columnHeader <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> objectKeys<\/span><span class=\"pun\">[<\/span><span class=\"pln\">column<\/span><span class=\"pun\">];<\/span><span class=\"pln\">\r\n    resourceValues<\/span><span class=\"pun\">[<\/span><span class=\"lit\">0<\/span><span class=\"pun\">][<\/span><span class=\"pln\">column<\/span><span class=\"pun\">]<\/span> <span class=\"pun\">=<\/span><span class=\"pln\"> columnHeader<\/span><span class=\"pun\">;<\/span>\r\n    \r\n    <span class=\"com\">\/\/ Read and set each row in this column.   <\/span>\r\n    <span class=\"kwd\">for<\/span> <span class=\"pun\">(<\/span><span class=\"kwd\">var<\/span><span class=\"pln\"> row <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> row <\/span><span class=\"pun\">&lt;<\/span><span class=\"pln\"> numRows <\/span><span class=\"pun\">+<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> row<\/span><span class=\"pun\">++)<\/span> <span class=\"pun\">{<\/span>\r\n      <span class=\"kwd\">var<\/span><span class=\"pln\"> resource <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> resourceDataList<\/span><span class=\"pun\">[<\/span><span class=\"pln\">row <\/span><span class=\"pun\">-<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">];<\/span>\r\n      <span class=\"kwd\">var<\/span><span class=\"pln\"> value <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> resource<\/span><span class=\"pun\">[<\/span><span class=\"pln\">columnHeader<\/span><span class=\"pun\">];<\/span><span class=\"pln\">\r\n      resourceValues<\/span><span class=\"pun\">[<\/span><span class=\"pln\">row<\/span><span class=\"pun\">][<\/span><span class=\"pln\">column<\/span><span class=\"pun\">]<\/span> <span class=\"pun\">=<\/span><span class=\"pln\"> value<\/span><span class=\"pun\">;<\/span>\r\n    <span class=\"pun\">}<\/span>\r\n  <span class=\"pun\">}<\/span>\r\n  \r\n  <span class=\"com\">\/\/ Remove any existing data in the sheet and set the new values.<\/span><span class=\"pln\">\r\n  resourceSheet<\/span><span class=\"pun\">.<\/span><span class=\"pln\">clear<\/span><span class=\"pun\">()<\/span><span class=\"pln\">\r\n  resourceRange<\/span><span class=\"pun\">.<\/span><span class=\"pln\">setValues<\/span><span class=\"pun\">(<\/span><span class=\"pln\">resourceValues<\/span><span class=\"pun\">);<\/span> \r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<ol start=\"7\" type=\"1\">\n<li>Salve seu projeto de script.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h4>Revis\u00e3o de c\u00f3digo<\/h4>\n<p>Voc\u00ea acabou de adicionar muitos c\u00f3digos!\u00a0Vamos examinar cada fun\u00e7\u00e3o que voc\u00ea adicionou individualmente para entender como elas funcionam:<\/p>\n<h3><code>onOpen()<\/code><\/h3>\n<p>Aqui, voc\u00ea acabou de adicionar alguns novos itens de menu ao seu\u00a0<code>Quick formats<\/code>\u00a0menu.\u00a0Voc\u00ea adicionou uma linha separadora ao menu e usou o\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/base\/menu#addSubMenu(Menu)\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Menu<\/code><code>.addSubMenu(menu)<\/code><\/a>\u00a0m\u00e9todo para criar uma estrutura de menu aninhada com tr\u00eas novos itens.\u00a0Os novos itens s\u00e3o adicionados com o\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/base\/menu#additemcaption,-functionname\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Menu.addItem(caption, functionName)<\/code><\/a>\u00a0m\u00e9todo.<\/p>\n<p>&nbsp;<\/p>\n<h4>Fun\u00e7\u00f5es de wrapper<\/h4>\n<p>Todos os itens de menu que voc\u00ea adicionou est\u00e3o fazendo a mesma coisa: eles est\u00e3o tentando criar uma nova planilha com dados extra\u00eddos de\u00a0<a href=\"https:\/\/swapi.co\/\" target=\"_blank\" rel=\"noopener noreferrer\">SWAPI<\/a>\u00a0.\u00a0A \u00fanica diferen\u00e7a \u00e9 que cada um est\u00e1 focado em um filme diferente.<\/p>\n<p>Seria conveniente escrever apenas uma \u00fanica fun\u00e7\u00e3o para criar a folha e fazer com que essa fun\u00e7\u00e3o aceitasse um par\u00e2metro para determinar qual filme usar.\u00a0No entanto, o\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/base\/menu#additemcaption,-functionname\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Menu.addItem(caption, functionName)<\/code><\/a>\u00a0m\u00e9todo n\u00e3o permite que voc\u00ea passe par\u00e2metros para a fun\u00e7\u00e3o chamada pelo menu.\u00a0Ent\u00e3o, como voc\u00ea evita escrever o mesmo c\u00f3digo tr\u00eas vezes?<\/p>\n<p>A resposta s\u00e3o\u00a0<em>fun\u00e7\u00f5es de inv\u00f3lucro<\/em>\u00a0.\u00a0Estas s\u00e3o fun\u00e7\u00f5es leves que voc\u00ea pode chamar para chamar imediatamente outra fun\u00e7\u00e3o com par\u00e2metros espec\u00edficos definidos.<\/p>\n<p>Aqui, o c\u00f3digo utiliza tr\u00eas fun\u00e7\u00f5es de mensagens publicit\u00e1rias:\u00a0<code>createPeopleSheetIV()<\/code>,\u00a0<code>createPeopleSheetV()<\/code>, e\u00a0<code>createPeopleSheetVI()<\/code>.\u00a0Os itens do menu est\u00e3o vinculados a essas fun\u00e7\u00f5es.\u00a0Quando um item de menu \u00e9 clicado, a fun\u00e7\u00e3o de inv\u00f3lucro executa e imediatamente chama a fun\u00e7\u00e3o do criador de folha principal\u00a0<code>createResourceSheet_(resourceType, idNumber, episodeNumber)<\/code>, passando os par\u00e2metros apropriados para aquele item de menu.\u00a0Nesse caso, isso significa pedir \u00e0 fun\u00e7\u00e3o de criador de planilhas para criar uma planilha preenchida com os dados dos personagens principais de um dos tr\u00eas primeiros filmes de Star Wars.<\/p>\n<p>&nbsp;<\/p>\n<aside class=\"special\">\u00a0 \u00a0 Nota\u00a0: Se desejar, voc\u00ea pode criar mais fun\u00e7\u00f5es de inv\u00f3lucro para criar diferentes tipos de folhas!\u00a0Voc\u00ea s\u00f3 precisa saber que tipo de recurso solicitar e que ID de filme usar.\u00a0Os tipos de recurso de exemplo incluem &#8216;\u00a0<code>planets<\/code>&#8216; e &#8216;\u00a0<code>starships<\/code>&#8216;, e a API aceita os n\u00fameros de 1 a 7 como IDs de filme.<\/aside>\n<p>&nbsp;<\/p>\n<h3><code>createResourceSheet_(resourceType, idNumber, episodeNumber)<\/code><\/h3>\n<p>Esta \u00e9 a principal fun\u00e7\u00e3o do criador de folhas para este exerc\u00edcio.\u00a0Com a ajuda de algumas fun\u00e7\u00f5es auxiliares, ele obt\u00e9m os dados da API, os analisa, cria uma nova planilha, grava os dados da API nessa planilha e formata a planilha usando as fun\u00e7\u00f5es que voc\u00ea construiu nas se\u00e7\u00f5es anteriores.\u00a0Vamos dar uma olhada nos detalhes:<\/p>\n<p>Primeiro, a fun\u00e7\u00e3o usa\u00a0<code>fetchApiResourceObject_(url)<\/code>para fazer uma solicita\u00e7\u00e3o \u00e0 API para recuperar informa\u00e7\u00f5es b\u00e1sicas do filme.\u00a0A resposta da API inclui uma cole\u00e7\u00e3o de URLs que o c\u00f3digo pode usar para obter mais detalhes sobre pessoas espec\u00edficas (conhecidas aqui como\u00a0<em>recursos<\/em>\u00a0) dos filmes.\u00a0O c\u00f3digo coleta tudo isso na\u00a0<code>resourceUrls<\/code>matriz.<\/p>\n<p>Em seguida, o c\u00f3digo usa\u00a0<code>fetchApiResourceObject_(url)<\/code>repetidamente para chamar a API para cada URL de recurso em\u00a0<code>resourceUrls<\/code>.\u00a0Os resultados s\u00e3o armazenados na\u00a0<code>resourceDataList<\/code>matriz.\u00a0Cada elemento dessa matriz \u00e9 um objeto que descreve um personagem diferente do filme.<\/p>\n<p>Os objetos de dados de recursos t\u00eam v\u00e1rias chaves comuns que mapeiam para informa\u00e7\u00f5es sobre aquele personagem.\u00a0Por exemplo, a chave &#8216;\u00a0<code>name<\/code>&#8216; mapeia para o nome daquele personagem no filme.\u00a0Assumimos que as chaves para cada objeto de dados de recursos s\u00e3o todas id\u00eanticas, uma vez que se destinam a usar estruturas de objetos comuns.\u00a0A lista de chaves \u00e9 necess\u00e1ria posteriormente, portanto, o c\u00f3digo armazena a lista de chaves\u00a0<code>resourceObjectKeys<\/code>usando o m\u00e9todo JavaScript\u00a0<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Object\/keys\" target=\"_blank\" rel=\"noopener noreferrer\">Object.keys ()<\/a>\u00a0.<\/p>\n<p>Em seguida, a fun\u00e7\u00e3o de construtor chama a\u00a0<code>createNewSheet_(name)<\/code>fun\u00e7\u00e3o auxiliar para criar a nova planilha onde os novos dados ser\u00e3o colocados.\u00a0Chamar essa fun\u00e7\u00e3o auxiliar tamb\u00e9m ativa a nova planilha.<\/p>\n<p>Depois que a planilha \u00e9 criada, a fun\u00e7\u00e3o auxiliar\u00a0<code>fillSheetWithData_(resourceSheet, objectKeys, resourceDataList)<\/code>\u00e9 chamada para adicionar todos os dados da API \u00e0 nova planilha.<\/p>\n<p>Por fim, todas as fun\u00e7\u00f5es de\u00a0formata\u00e7\u00e3o\u00a0criadas anteriormente s\u00e3o chamadas para aplicar as mesmas regras de\u00a0formata\u00e7\u00e3o\u00a0aos novos dados.\u00a0Como a nova planilha \u00e9 a ativa, o c\u00f3digo pode reutilizar essas fun\u00e7\u00f5es sem modifica\u00e7\u00e3o!<\/p>\n<h3><code>fetchApiResourceObject_(url)<\/code><\/h3>\n<p>Esta fun\u00e7\u00e3o auxiliar \u00e9 semelhante \u00e0\u00a0<code>fetchBookData_(ISBN)<\/code>\u00a0fun\u00e7\u00e3o auxiliar usada no codelab anterior (\u00a0<a href=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-3\" target=\"_blank\" rel=\"noopener noreferrer\">Trabalhando com dados<\/a>\u00a0).\u00a0Ele pega o URL fornecido e usa o\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/url-fetch\/#urlfetchapp\" target=\"_blank\" rel=\"noopener noreferrer\"><code>UrlFetchApp.fetch(url, params)<\/code><\/a>\u00a0m\u00e9todo para obter uma resposta.\u00a0A resposta \u00e9 ent\u00e3o analisada em um objeto JSON usando os\u00a0m\u00e9todos\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/url-fetch\/http-response#getcontenttext\" target=\"_blank\" rel=\"noopener noreferrer\"><code>HTTPResponse.getContextText()<\/code><\/a>\u00a0e JavaScript\u00a0<a href=\"https:\/\/www.w3schools.com\/js\/js_json_parse.asp\" target=\"_blank\" rel=\"noopener noreferrer\"><code>JSON.parse(json)<\/code><\/a>.\u00a0O objeto JSON resultante \u00e9 ent\u00e3o retornado.<\/p>\n<p>&nbsp;<\/p>\n<aside class=\"special\">\u00a0 \u00a0 Nota\u00a0: Se voc\u00ea trabalha muito com APIs, esta fun\u00e7\u00e3o pode ser bastante \u00fatil quando voc\u00ea precisa recuperar informa\u00e7\u00f5es de API.\u00a0\u00c9 generalizado para funcionar com qualquer URL de API, ent\u00e3o considere salv\u00e1-lo para uso posterior!<\/aside>\n<p>&nbsp;<\/p>\n<h3><code>createNewSheet_(name)<\/code><\/h3>\n<p>Esta fun\u00e7\u00e3o auxiliar \u00e9 bastante simples.\u00a0Ele primeiro v\u00ea se uma folha com o nome fornecido j\u00e1 existe na planilha.\u00a0Em caso afirmativo, a fun\u00e7\u00e3o ativa essa planilha e a retorna.<\/p>\n<p>Se a planilha ainda n\u00e3o existe, a fun\u00e7\u00e3o a cria com\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/spreadsheet#insertsheetsheetname\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Spreadsheet.insertSheet(sheetName)<\/code><\/a>\u00a0(o que tamb\u00e9m a ativa) e retorna a nova planilha.<\/p>\n<h3><code>fillSheetWithData_(resourceSheet, objectKeys, resourceDataList)<\/code><\/h3>\n<p>Esta fun\u00e7\u00e3o auxiliar \u00e9 respons\u00e1vel por preencher a nova planilha com os dados da API.\u00a0Ele leva como par\u00e2metros a nova planilha, a lista de chaves de objeto e a lista de objetos de recursos da API como par\u00e2metros.\u00a0Cada chave de objeto representa uma coluna na nova planilha e cada objeto de recurso representa uma linha.<\/p>\n<p>Primeiro, a fun\u00e7\u00e3o calcula o n\u00famero de linhas e colunas necess\u00e1rias para apresentar os novos dados da API.\u00a0Este \u00e9 apenas o tamanho da lista de recursos e chaves, respectivamente.\u00a0A fun\u00e7\u00e3o ent\u00e3o define um intervalo de sa\u00edda (\u00a0<code>resourceRange<\/code>) onde os dados ser\u00e3o colocados, adicionando uma linha adicional para conter os cabe\u00e7alhos das colunas.\u00a0A vari\u00e1vel\u00a0<code>resourceValues<\/code>\u00a0cont\u00e9m uma matriz de valores 2D extra\u00edda\u00a0<code>resourceRange<\/code>.<\/p>\n<p>A fun\u00e7\u00e3o ent\u00e3o percorre cada chave de objeto na\u00a0<code>objectKeys<\/code>\u00a0lista.\u00a0A chave \u00e9 definida como o cabe\u00e7alho da coluna e, em seguida, um segundo loop passa por cada objeto de recurso.\u00a0Para cada par (linha, coluna), as informa\u00e7\u00f5es de API correspondentes s\u00e3o copiadas para o\u00a0<code>resourceValues[row][column]<\/code>\u00a0elemento.<\/p>\n<p>&nbsp;<\/p>\n<aside class=\"special\">\u00a0 \u00a0 Observa\u00e7\u00e3o\u00a0: lembre-se de que as linhas e colunas no Planilhas s\u00e3o indexadas 1, enquanto as matrizes JavaScript s\u00e3o indexadas 0.\u00a0Por causa dessa diferen\u00e7a, muitas vezes temos que adicionar ou sujeito 1 dos \u00edndices ao programar no Apps Script, como estamos fazendo aqui.<\/aside>\n<p>&nbsp;<\/p>\n<p>Depois de\u00a0<code>resourceValues<\/code>\u00a0preenchida, a planilha de destino \u00e9 apagada usando\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/sheet#clear\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Sheet.clear()<\/code><\/a>\u00a0(caso ela tivesse algum dado de cliques do item de menu anterior).\u00a0Finalmente, os novos valores s\u00e3o gravados na folha.<\/p>\n<p>&nbsp;<\/p>\n<h4>Resultados<\/h4>\n<p>Voc\u00ea pode ver os resultados do seu trabalho \u00e1rduo fazendo o seguinte:<\/p>\n<ol start=\"3\" type=\"1\">\n<li>Salve seu projeto de script no editor do Apps Script, caso ainda n\u00e3o tenha feito isso.<\/li>\n<li>Clique no\u00a0item de menu\u00a0Formatos r\u00e1pidos&gt; Criar ficha de personagem&gt; Epis\u00f3dio IV\u00a0.<\/li>\n<\/ol>\n<p>Os resultados devem ser semelhantes aos seguintes:<\/p>\n<p class=\"image-container\"><img src=\"https:\/\/codelabs.developers.google.com\/codelabs\/apps-script-fundamentals-4\/img\/d9c472ab518d8cef.gif\" width=\"843\" height=\"568\" \/><\/p>\n<p>\u00a0 \u00a0 Voc\u00ea escreveu um c\u00f3digo que importa dados para o Planilhas e os formata automaticamente!\u00a0Bom trabalho!<\/p>\n<p>&nbsp;<\/p>\n<h4>O que voc\u00ea aprendeu?<\/h4>\n<ul>\n<li>Como aplicar v\u00e1rias opera\u00e7\u00f5es de\u00a0formata\u00e7\u00e3o\u00a0do Planilhas com o Apps Script.<\/li>\n<li>Como criar submenus com a\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/guides\/triggers\/#onopene\" target=\"_blank\" rel=\"noopener noreferrer\"><code>onOpen()<\/code><\/a>fun\u00e7\u00e3o.<\/li>\n<li>Como formatar uma lista obtida de\u00a0objetos\u00a0<a href=\"https:\/\/www.json.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">JSON<\/a>\u00a0em uma nova folha de dados com o Apps Script.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<aside class=\"special\">\n<h4>Termos-chave\u00a0:<\/h4>\n<ul>\n<li>Ativo (status)\u00a0: indica que a planilha, planilha, intervalo ou c\u00e9lula especificada \u00e9 a que est\u00e1 sendo exibida ou destacada pelo usu\u00e1rio da planilha.<\/li>\n<li>C\u00e9lula ativa\u00a0: a \u00fanica c\u00e9lula destacada na p\u00e1gina ativa que tem o foco do cursor<\/li>\n<li>Intervalo ativo\u00a0: o grupo de uma ou mais c\u00e9lulas atualmente destacadas na p\u00e1gina ativa.<\/li>\n<li>API\u00a0: interface de programa\u00e7\u00e3o de aplicativos;\u00a0este \u00e9 um servi\u00e7o que programas ou scripts podem contatar para recuperar informa\u00e7\u00f5es ou realizar a\u00e7\u00f5es espec\u00edficas.<\/li>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/guides\/services\/authorization\" target=\"_blank\" rel=\"noopener noreferrer\">Autoriza\u00e7\u00e3o<\/a>\u00a0: o processo em que o usu\u00e1rio concede permiss\u00f5es para permitir que o Apps Script acesse dados privados nos servi\u00e7os relevantes do Google.<\/li>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/guides\/bound\" target=\"_blank\" rel=\"noopener noreferrer\">Script vinculado ao cont\u00eainer<\/a>\u00a0: qualquer script vinculado e criado a partir de um documento do G Suite, como uma planilha ou um documento do Google.<\/li>\n<li>Fun\u00e7\u00e3o auxiliar\u00a0: uma fun\u00e7\u00e3o, geralmente privada, que \u00e9 chamada por outra pessoa para concluir uma pequena subtarefa.\u00a0As fun\u00e7\u00f5es auxiliares geralmente s\u00e3o usadas quando a subtarefa precisa ser realizada muitas vezes em locais diferentes.<\/li>\n<li><a href=\"https:\/\/www.json.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">JSON<\/a>\u00a0: formato de arquivo para definir objetos de dados e suas caracter\u00edsticas de texto.<\/li>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/guides\/triggers\/#onopene\" target=\"_blank\" rel=\"noopener noreferrer\"><code>onOpen()<\/code><\/a>: Se definido em um script, um gatilho simples que dispara sempre que um arquivo \u00e9 aberto ou recarregado.<\/li>\n<li>Fun\u00e7\u00f5es privadas\u00a0: uma fun\u00e7\u00e3o que n\u00e3o pode ser chamada como parte de uma\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/guides\/libraries\" target=\"_blank\" rel=\"noopener noreferrer\">biblioteca<\/a>\u00a0ou por clientes atrav\u00e9s\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/guides\/html\/communication\" target=\"_blank\" rel=\"noopener noreferrer\">da comunica\u00e7\u00e3o cliente-servidor<\/a>\u00a0.\u00a0As fun\u00e7\u00f5es privadas do Apps Script t\u00eam nomes que terminam com &#8220;_&#8221;.<\/li>\n<li>Intervalo\u00a0: um intervalo representa um grupo de uma ou mais c\u00e9lulas adjacentes em uma p\u00e1gina.\u00a0A\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/range\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Range<\/code><\/a>classe oferece a capacidade de ler e atualizar\u00a0intervalos\u00a0em uma planilha.<\/li>\n<li>Editor de script\u00a0: o editor de c\u00f3digo do Apps Script.<\/li>\n<li>Gatilhos simples\u00a0: um subtipo de\u00a0gatilhos\u00a0no Apps Script que t\u00eam nomes de fun\u00e7\u00e3o de gatilho reservados e certas\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/guides\/triggers\/#restrictions\" target=\"_blank\" rel=\"noopener noreferrer\">restri\u00e7\u00f5es<\/a>\u00a0;\u00a0por exemplo\u00a0<code>onOpen()<\/code>,.<\/li>\n<li>Folha\u00a0: uma \u00fanica p\u00e1gina de uma planilha.\u00a0A\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/sheet\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Sheet<\/code><\/a>classe permite acessar e modificar planilhas.<\/li>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/spreadsheet-app\" target=\"_blank\" rel=\"noopener noreferrer\"><code>SpreadsheetApp<\/code><\/a>: A\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/spreadsheet-app\" target=\"_blank\" rel=\"noopener noreferrer\"><code>SpreadsheetApp<\/code><\/a>classe serve como classe pai para o servi\u00e7o de planilha e fornece um ponto de partida para o c\u00f3digo que l\u00ea ou manipula dados do Planilhas Google.<\/li>\n<li>Planilha\u00a0: um arquivo do Planilhas Google que reside no Google Drive.\u00a0A\u00a0<a href=\"https:\/\/developers.google.com\/apps-script\/reference\/spreadsheet\/spreadsheet\" target=\"_blank\" rel=\"noopener noreferrer\"><code>Spreadsheet<\/code><\/a>classe permite que voc\u00ea acesse e modifique planilhas.<\/li>\n<li>Gatilhos\u00a0: um evento vinculado a uma fun\u00e7\u00e3o do Apps Script.\u00a0Quando o evento (como uma planilha sendo aberta) ocorre, o acionador &#8220;dispara&#8221; e executa automaticamente a fun\u00e7\u00e3o do Apps Script associada.<\/li>\n<li><a href=\"https:\/\/developers.google.com\/apps-script\/reference\/url-fetch\/\" target=\"_blank\" rel=\"noopener noreferrer\">UrlFetch<\/a>\u00a0: o servi\u00e7o Apps Script que permite que os scripts se conectem a endpoints de URL para fazer solicita\u00e7\u00f5es e receber respostas.<\/li>\n<li>Fun\u00e7\u00f5es de wrapper\u00a0:\u00a0fun\u00e7\u00f5es\u00a0utilit\u00e1rias simples que s\u00e3o usadas para chamar outras fun\u00e7\u00f5es mais complexas, passando-lhes um conjunto espec\u00edfico de par\u00e2metros.<\/li>\n<\/ul>\n<\/aside>\n","protected":false},"excerpt":{"rendered":"<p>Configurando Antes de continuar, voc\u00ea precisa de uma planilha com alguns dados.\u00a0Como antes, fornecemos uma folha de dados que voc\u00ea pode copiar para esses exerc\u00edcios.\u00a0Execute as seguintes etapas: Clique neste link para copiar a planilha de dados\u00a0e, em seguida, clique no bot\u00e3o\u00a0Fazer uma c\u00f3pia\u00a0.\u00a0A nova planilha \u00e9 colocada na pasta inicial do Google Drive e [&hellip;]<\/p>\n","protected":false},"author":667,"featured_media":0,"parent":349,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","footnotes":""},"class_list":["post-708","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/pages\/708","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/users\/667"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/comments?post=708"}],"version-history":[{"count":4,"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/pages\/708\/revisions"}],"predecessor-version":[{"id":730,"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/pages\/708\/revisions\/730"}],"up":[{"embeddable":true,"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/pages\/349"}],"wp:attachment":[{"href":"https:\/\/wp.ufpel.edu.br\/planilhasgoogle\/wp-json\/wp\/v2\/media?parent=708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}