debugging 如何在Google脚本中调试HtmlService中的JavaScript

hzbexzde  于 2022-11-14  发布在  Go
关注(0)|答案(2)|浏览(115)

我在Google HTMLService(Google脚本中的html窗口)中的JavaScript中找不到语法错误。我的工作涉及Google可视化,这需要语法错误。这是我第一次使用JavaScript和HTML,所以我很容易犯错误,这是一个令人苦恼的问题。
执行日志只显示html已经运行,我不知道在代码中的什么地方查找错误。行x”或“对象不接受行y”,但我就是不知道去哪里找。
我将感谢任何关于在哪里找到解决方案或如何澄清我的问题的指针。

mcdcgff0

mcdcgff01#

您可以使用浏览器的开发者工具。在Chrome中,按下f12按钮,或选择更多工具开发者工具,浏览器中将打开如下窗口:

其中一个选项卡标记为Console。您可以使用以下选项将信息打印到控制台:

console.log('This is text: ' + myVariable);

陈述式。
当应用程序脚本宏运行并将HTML提供给浏览器时,如果有错误,它们将显示在控制台日志中。
我用你张贴的HTML,并在这个控制台得到消息:

因此,对于HTML的<script>标签中的JavaScript,您不必在Apps Script代码编辑器中查找错误。您需要使用浏览器的开发工具。.gs代码文件中的JavaScript是服务器端代码。它在Google的服务器上运行。HTML标签中的JavaScript在用户计算机上的用户浏览器中运行。
您还可以在浏览器中逐步执行客户端JavaScript代码。
一个问题是,当HTML被提供时,代码被改变。
因此,应用程序脚本代码编辑器中的JavaScript看起来将与提供给浏览器的JavaScript不同。如果您查看提供给浏览器的JavaScript,它看起来将与原始文件中Script标签中的代码完全不同。
您也可以使用包含错误检查功能的代码编辑器。NetBeans有一个免费的代码编辑器。

yzxexxkh

yzxexxkh2#

调试Google Apps Script Web应用程序在很大程度上取决于所使用的Google Apps Script功能,即是否使用模板化HTML创建,客户端是否与服务器端通信等。
由于OP案例中Google Apps脚本执行日志未显示任何错误消息,因此很可能是创建了HtmlOutput,并且应该可以在客户端检查代码。
Google向客户端发送一个IIFE,将传递给HtmlService的HTML/CSS/JavaScript的satinized版本插入到iframe中,也就是说白色将不相同,注解将不包含在其他更改中。无论如何,您可以使用开发工具查看生成的JavaScript,并从开发工具控制台调用JavaScript函数,等等。
要从Google Apps Script Web应用执行客户端JavaScript,请首先在控制台下拉选择器上选择userHtmlFrame(userCodeAppPanel)

您甚至可以使用开发工具的元素面板或开发工具控制台中的JavaScript来更改客户端JavaScript,以及执行其他操作。请记住,在那里所做的更改不会保存到Google Apps脚本项目中。
值得一提的是,使用Google Apps脚本编辑器可以调试纯JavaScript。更简单的方法是将JavaScript代码放在一个.gs文件中,并使用HtmlTemplate创建Web应用程序的HtmlOutput对象,同时使用:此外,该方法将有助于使用桌面工具测试JavaScript代码,将有助于更容易地修复由缺少/错放<,>,",',(,),:,;导致的“格式错误”错误,并利用.html文件中不可用的JavaScript的intellisense特征。
Web应用程序的示例,其客户端JavaScript位于.gs文件而不是.html文件中。客户端JavaScript位于javascript.js.gs文件中。在这个过于简化的示例中,要测试的函数需要参数。这使得该函数不能直接从编辑器工具栏运行,因此在www.example.com文件中有两个“测试”函数test.gs,用于设置所需参数并调用要调试的函数。
Code.gs

/**
 * Respond to HTTP GET request. Returns a htmlOutput object.
 */
function doGet(e){
  return HtmlService.createTemplateFromFile('index')
    .evaluate()
    .setTitle('My web app');
}

/**
 * Returns the file content of a .gs or .html Google Apps Script file.
 *
 * @param {filename} Google Apps Script file name. It should not include the .gs or .html file extension
 */
function include(filename){
   const [name, sufix] = filename.split('.');
   switch(sufix){
     default: 
       return HtmlService.createHtmlOutputFromFile(name).getContent();
     case 'js':
       const content = ScriptApp.getResource(name).getDataAsString(); 
       return `<script>${content}</script>`;
     }
   
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <?!= include('stylesheet.css') ?>
  </head>
  <body>
    <p>Add here some content</p>
    <?!= include('javascript.js') ?>
  </body>
</html>

javascript.js.gs

/**
 * Arithmetic addition of two operands. Validates that both operands are JavaScript numbers.
 *
 * @param {number} a Left addition operand
 * @param {number} a Right addition operand
 */
function addition(a,b){
   if(typeof a !== 'number') || typeof b !== 'number') throw new Error('Operands should be numbers');
   return a + b;
}

tests.gs

/**
 * Passing two numbers. Expected result: 2.
 */
function test_addition_01(){
  const a = 1;
  const b = 1;
  const result = addition(a,b);
  console.log(result === 2 ? 'PASS' : 'FAIL');
}

/**
 * Passing one number and one string. Expected result: Custom error message.
 */
function test_addition_02(){
  const a = 1;
  const b = '1';
  try{
    const result = addition(a,b);
  } catch(error) {
    console.log(error.message === 'Operands should be numbers' ? 'PASS' : 'FAIL');
  }
  
}

注意:ScriptApp.getResource无法从库中提取文件,即使在库中包含此方法
对于调试使用其他技术的JavaScript,例如document.getElementById(id),一个选项是开发工具控制台或使用try... catch并从服务器端调用一些函数,google.script.run,以便在执行日志中记录错误。
要调试调用JavaSCript库的JavaScript,可以将库代码复制到一个或多个.gs文件中,或者使用UrlFetchAppeval将其加载到服务器端(请参见How to load javascript from external source and execute it in Google Apps Script

相关问题