Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何在HTML服务中从列表框中获取值_Google Apps Script_Web Applications_Listbox - Fatal编程技术网

Google apps script 如何在HTML服务中从列表框中获取值

Google apps script 如何在HTML服务中从列表框中获取值,google-apps-script,web-applications,listbox,Google Apps Script,Web Applications,Listbox,我在谷歌应用程序脚本中遇到HTML服务问题。我试图从列表框中获取一个值,以提取和填充表单的其余部分。这在使用uiApp时效果很好,但由于谷歌决定下个月关闭uiApp,我别无选择,只能将我的所有应用迁移到HTML服务 我在stackoverflow上发现了一些关于使用Scriptlet的问题,但我不断地遇到错误 HTML 选择诊所: doThisOnChange=函数(值) { 警惕(“用值做某事:“+value”); } 诊所名称: 使用scriptlet时,脚本似乎无法获取传递的值。获取错

我在谷歌应用程序脚本中遇到HTML服务问题。我试图从列表框中获取一个值,以提取和填充表单的其余部分。这在使用
uiApp
时效果很好,但由于谷歌决定下个月关闭
uiApp
,我别无选择,只能将我的所有应用迁移到HTML服务

我在stackoverflow上发现了一些关于使用Scriptlet的问题,但我不断地遇到错误

HTML


选择诊所:
doThisOnChange=函数(值)
{
警惕(“用值做某事:“+value”);
}
诊所名称:
使用scriptlet时,脚本似乎无法获取传递的值。获取错误

ReferenceError:“值”未定义。(第5行,文件“代码”)

通过使用
window.document.getElementById
方法,我终于能够获得填充字段的表单,但是当不使用scriptlet时,脚本似乎停止了


任何帮助都将不胜感激。

问题

您混淆了只在模板评估(scriplets)和客户端脚本上运行一次的服务器端组件。因此,不能在scriplet中访问用作
doThisOnChange
参数的
value

解决方案

如果需要多次调用服务器端组件,则应使用
google.script.run
API,因为这是与服务器端函数通信的唯一方式

样本

因此,如果我正确理解了您的目标,您应该像这样解耦代码(请注意,服务器端函数显式
返回所需的输出并设置
with successhandler()
对服务器端函数成功运行结果执行客户端操作非常重要):

服务器端

客户端

请注意,处理2D
Array
实例只是一种最佳实践,因为
getValue()
/
getValues()
方法计算量很大。总之,您不必直接返回诊所的
名称
,而是创建一个包含所有诊所属性的
对象
实例(稍后可通过
在客户端回调函数中引用),或者您只需传递并返回
数组
,然后在客户端对其进行操作:

function getData(ClinicID) {
  var ss     = SpreadsheetApp.openById("MyID");
  var sheet  = ss.getSheetByName('Data');
  var range  = sheet.getRange(yourRangeboundaries); 
  var values = range.getValues(); //gets 2D Array of values;

  var output = {}; //initiate output Object;

  output.name = values[0][0]; //assuming name is in 1st row 1st column;
  output.phone = values[0][4]; //assuming phone is in 1st row 5th column;
  //etc;

  return output;
}
有用的注释

google.script.run
的客户端到服务器通信本质上是异步的,这意味着您不必等到服务器端函数完成后再执行其他任务,但同时您只能访问回调函数范围内的服务器端结果

有用的链接

  • 模板化HTML
  • 客户端到服务器的通信
  • google.script.run
    API
  • getValue()
    方法
    是的,我认为我们在正确的轨道上,但是当我试图修改您提供的解决方案时,它仍然不起作用。我试图做的是从selectClinic列表框中收集数据(clinicID)。然后使用该ID,从电子表格中收集数据,用该信息(姓名、电话号码、传真号码、电子邮件)填充表单字段。奇怪的是,我相信这也应该奏效,但谷歌不让它这样做。嗨,@DerykP!我一开始忽略了服务器端组件的一个问题-您应该从
    范围
    中提取值(或使用
    getValues()
    的值),否则返回到客户端的数据类型无效!对成功了。我一定是在我的原始代码中过度查看了GetValue。是否有一种方法可以使用相同的脚本填充其他字段?(例如:电子表格中的电话号码[E]传真号码[F],电子邮件[G])。你帮了大忙@olegNP!Ofc,您可以填充任何内容-
    fillName
    +
    getClinicName
    只是您可以做的一个示例(只需参考更宽的
    范围
    ,使用
    getValues()提取值)
    ,迭代检索值的2D
    数组
    ,然后再次输出到
    数组
    对象
    -服务器端+客户端-引用多个字段),谢谢@oleg。你真的明白我在这里要做什么。有没有可能给我举一个在2D数组上迭代两行的例子?我试过了,但一直没有定义。也许我没有正确地理解它(对于这种类型的编程来说是新的)。
    function getClinicName(ClinicID) {
      var OPCDSS = SpreadsheetApp.openById("MyID"); //I assume SS === OPCDSS?;
      var sheet = OPCDSS.getSheetByName('Data');
      var range = sheet.getRange("D"+ClinicID+":D"+ClinicID);
      var name  = range.getValue(); //this part was originally missing;
      return name;    
    }
    
      <script>
        /**
         * Asynchronously calls server-side function;
         * @param {String} value clinic select value; 
         */
        function doThisOnChange (value) {
          alert( "Do something with the value: " + value );
          google.script.run.withSuccessHandler(fillName).getClinicName(value);
        }
    
        /**
         * Performs client-side actions on server-side function return;
         * @param {*} serverOutput value returned from server-side;
         */
        function fillName (serverOutput) {
          var clinicNameInput = document.getElementById('clinicName');
              clinicNameInput.value = serverOutput;
        }
    </script>
    
    [ //pseudo-code;
      row1 [ col1 , ..., colN ] ,
      ...,
      rowN [ col1, ..., colN ] 
    ]
    
    function getData(ClinicID) {
      var ss     = SpreadsheetApp.openById("MyID");
      var sheet  = ss.getSheetByName('Data');
      var range  = sheet.getRange(yourRangeboundaries); 
      var values = range.getValues(); //gets 2D Array of values;
    
      var output = {}; //initiate output Object;
    
      output.name = values[0][0]; //assuming name is in 1st row 1st column;
      output.phone = values[0][4]; //assuming phone is in 1st row 5th column;
      //etc;
    
      return output;
    }