Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >图纸提示框脚本

图纸提示框脚本
EN

Stack Overflow用户
提问于 2019-04-04 15:14:14
回答 1查看 395关注 0票数 0

我想创建一个在google sheet的特定列(即一组必填字段)中输入文本的提示演练。

首先,我在编码方面非常缺乏经验,所以到目前为止,我的尝试都是基于我的在线研究。我确信我通过重复脚本中的元素使脚本过于复杂了。

我希望它能够做到以下几点

1-点击自定义菜单。2-单击Add new Risk。3-提示框询问4个问题序列-(例如姓名、年龄、地址和工作)。4-捕获响应并将其放入工作表中的下一个可用行。5-提示框通过单击叉号或取消按钮取消整个过程。

要克服的问题

1-到目前为止,我可以让脚本来询问问题序列,但它只粘贴最后一个问题的答案,下一个可用行。

2-我想不出如何取消这个过程,它只是弹出一条消息并执行一系列命令

3-我需要我的响应固定到特定的列,即-不是所有粘贴到A2,B2,C2,D2。例如名称(A2)、年龄(G2)、地址(H2)、工作(X2)

任何帮助都将不胜感激

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    function onOpen() {
  SpreadsheetApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
      .createMenu('Risk Menu')
      .addItem('Add New Risk', 'showPrompt')
      .addToUi();
}

function showPrompt() {
  var ui = SpreadsheetApp.getUi(); // Same variations.
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var targetSheet = ss.getSheetByName("Sheet1");
  var range = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

  var result = ui.prompt(
      'Add New Risk - Madantory Field 1/4',
      'Please enter your name:',
      ui.ButtonSet.OK_CANCEL);

     var button = result.getSelectedButton();
  var text = result.getResponseText();
  if (button == ui.Button.OK) {
    // User clicked "OK".
    range.setValue(text);
  } else if (button == ui.Button.CANCEL) {
    // User clicked "Cancel".
    ui.alert('New risk cancelled');
  } else if (button == ui.Button.CLOSE) {
    // User clicked X in the title bar.
    ui.alert('You closed the dialog.');
  }


    var result2 = ui.prompt(
      'Add New Risk - Mandatory Field 2/4',
      'Please enter your address:',
      ui.ButtonSet.OK_CANCEL);


      var button2 = result2.getSelectedButton();
  var text2 = result2.getResponseText();
  if (button2 == ui.Button.OK) {
    // User clicked "OK".
    range.setValue(text2);
  } else if (button2 == ui.Button.CANCEL) {
    // User clicked "Cancel".
    ui.alert('New risk cancelled');
  } else if (button2 == ui.Button.CLOSE) {
    // User clicked X in the title bar.
    ui.alert('You closed the dialog.');
 }

  var result3 = ui.prompt(
      'Add New Risk - Mandatory Field 3/4',
      'Please enter your age:',
      ui.ButtonSet.OK_CANCEL);

       var button3 = result3.getSelectedButton();
  var text3 = result3.getResponseText();
  if (button3 == ui.Button.OK) {
    // User clicked "OK".
    range.setValue(text3);
  } else if (button3 == ui.Button.CANCEL) {
    // User clicked "Cancel".
    ui.alert('New risk cancelled');
  } else if (button3 == ui.Button.CLOSE) {
    // User clicked X in the title bar.
    ui.alert('You closed the dialog.');

  }

  var result4 = ui.prompt(
      'Add New Risk - Mandatory Field 4/4',
      'Please enter your job role:',
      ui.ButtonSet.OK_CANCEL);

  var button4 = result4.getSelectedButton();
  var text4 = result4.getResponseText();
  if (button4 == ui.Button.OK) {
    // User clicked "OK".
    range.setValue(text4);
  } else if (button4 == ui.Button.CANCEL) {
    // User clicked "Cancel".
    ui.alert('New risk cancelled.');
  } else if (button4 == ui.Button.CLOSE) {
    // User clicked X in the title bar.
    ui.alert('You closed the dialog.');
  }
}
EN

回答 1

Stack Overflow用户

发布于 2019-04-04 20:29:31

带有文本输入和select的自定义提示窗体

您可以将其用作对话框或can应用程序,因为其中包含doGet()。只有几个小模块可以作为webapp应用程序运行。一个是在script.html文件中标识webapp和/或对话框的注释,另一个是将Cancel按钮的名称更改为Cancel/Reload。就是这样。

Code.gs:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function onOpen(){
  SpreadsheetApp.getUi().createMenu('My Menu')
  .addItem("Show Dialog", 'showMyDialog')
  .addToUi()
}

function saveData(dObj) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  var rg=sh.getRange(1,1,1,sh.getLastColumn());
  var hA=rg.getValues()[0];
  var vA=[];
  for(var i=0;i<hA.length;i++) {
    vA.push((dObj[hA[i]])?dObj[hA[i]]:'');//Column headers must agree with form names
  }
  sh.appendRow(vA);
  return;
}

function showMyDialog(){
  var ui=HtmlService.createTemplateFromFile('TheHtml').evaluate();
  SpreadsheetApp.getUi().showModelessDialog(ui, 'Form Data');
}

function doGet(e){
  return HtmlService.createTemplateFromFile('TheHtml').evaluate();
}

function include(filename){
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

function getSelectOptions() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Options');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  return vA;
}

TheHtml.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <?!= include('resources') ?>
    <?!= include('css') ?>
  </head>
  <body>
    <?!= include('form') ?>
    <?!= include('script') ?>
  </body>
</html>

script.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>    
     $(function(){  
      google.script.run
      .withSuccessHandler(function(vA) {
        $('#sel1').css('background-color','#ffffff');
        updateSelect(vA);
      })
      .getSelectOptions();
      });

     function updateSelect(vA,id){
      var id=id || 'sel1';
      var select = document.getElementById(id);
      select.options.length = 0; 
      for(var i=0;i<vA.length;i++)
      {
        select.options[i] = new Option(vA[i][0],vA[i][1]);
      }
    }

    function getInputObject(obj) {
      var rObj={};
      for(var i=0;i<Object.keys(obj).length;i++){
        //console.log('Name: %s Type: %s',obj[i].name,obj[i].type);
        if(obj[i].type=="text"){
          rObj[obj[i].name]=obj[i].value;
        }
        if(obj[i].type=="select-one"){
          rObj[obj[i].name]=obj[i].options[obj[i].selectedIndex].value;
        }
      }
      return rObj;
    }

    function processForm(obj){
      var fObj=getInputObject(obj);
      //console.log(JSON.stringify(fObj));
      google.script.run
      .withSuccessHandler(function(rObj){
        document.getElementById("btn").disabled=true;
        var html='<br /><h1>Data Saved.</h1>';
        $(html).appendTo("body");
        google.script.host.close();
      })
      .saveData(fObj);
    }

    function cancel() {
      google.script.host.close();//as dailog
      //google.script.run.withSuccessHandler(function(url){window.open(url,'_top');}).getScriptURL();//as a webapp
      //https://stackoverflow.com/a/47754851/7215091
    }

    console.log('My Code');
</script>

form.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h3>Please enter Name, Age, Address and Job Title in the text areas adjacent to the text box descriptions.</h3>
<form id="myForm" onsubmit="event.preventDefault();processForm(this);" >
  <br /><select name="Number" id="sel1"></select>
  <br /><input type="text" id="txt1" name="Name" /> Name
  <br /><input type="text" id="txt2" name="Age" /> Age
  <br /><input type="text" id="txt3" name="Address" /> Address
  <br /><input type="text" id="txt4" name="Job" /> Job
  <br /><input id="btn" type="submit" value="Submit" />
  <br />
</form>
<br /><input type="button" value="Cancel/Reload" onClick="cancel();" />

css.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style>
body {background-color:#ffffff;}
input[type="button"],input[type="text"]{margin:0 0 2px 0;}
</style>

resources.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

日志表:

电子表格:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55519480

复制
相关文章
mysql中group_concat长度限制的问题
在mysql中的group_concat函数默认支持的最大字符数为1024。 当你使用group_concat函数时,超出第1024字符的字符会全部丢失。
botkenni
2023/10/09
2.6K0
GROUP BY 后 SELECT 列的限制:which is not functionally dependent on columns in GROUP BY clause
标准 SQL 规定,在对表进行聚合查询的时候,只能在 SELECT 子句中写下面 3 种内容:通过 GROUP BY 子句指定的聚合键、聚合函数(SUM 、AVG 等)、常量。我们来看个例子
chenchenchen
2021/09/06
3.2K0
【BUG之group_concat默认长度限制】
问题:mysql数据库使用group_concat将多个id组成字符串数组,一共200个,到160个被截断;
用户5640963
2019/07/25
3.1K0
资源限制问题
ulimit 是一个 shell 内置命令,用于设置当前 shell 会话的资源限制。
是山河呀
2025/02/03
950
MySQL group by数据丢失问题
在使用group by时需要注意,group by 关键字后的该列一定是唯一的,如果group列出现数据重复数据时,仅会显示一条数据。
关忆北.
2022/05/05
2.5K0
MySQL group by数据丢失问题
MySQL中group by 与 order by 一起使用排序问题
没有得到我们需要的结果,这是因为group by 和 order by 一起使用时,会先使用group by 分组,并取出分组后的第一条数据,所以后面的order by 排序时根据取出来的第一条数据来排序的,但是第一条数据不一定是分组里面的最大数据。
星哥玩云
2022/08/18
1.8K0
MySQL中group by 与 order by 一起使用排序问题
MySQL里面的group by问题浅析
mysql> select backup_date ,count(*) piece_no from redis_backup_result;
jeanron100
2018/09/29
8410
GROUP BY与COUNT用法详解
在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
全栈程序员站长
2022/08/24
2.7K0
GROUP BY与COUNT用法详解
count(distinct) 与group by 浅析
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步
全栈程序员站长
2022/08/26
9210
gitlab访问限制问题------Forbidden
重启-gitlab:       gitlab-ctl restart          
Wyc
2018/09/11
2.5K0
Group_concat介绍与例子
进公司做的第一个项目就是做一个订单追踪查询,里里外外连接了十一个表,作为公司菜鸡的我麻了爪.
全栈程序员站长
2022/07/07
2620
Group_concat介绍与例子
group by 报错_group by null
mysql bug #8652 有可能不成功,依赖于生成的两次虚拟表的主键不同引发报错
全栈程序员站长
2022/11/11
1.3K0
group by 报错_group by null
组复制要求和限制 | 全方位认识 MySQL 8.0 Group Replication
--upgrade=minimal:当MySQL Server指定--upgrade=minimal选项启动时,如果发现需要执行更新,则,在执行升级操作完成之后,可能会导致组复制无法启动,因为minimal选项在执行更新时,只会更新数据字典、information_schema、performance_schema,但不会更新组复制内部所依赖的系统表(--upgrade选项在MySQL 8.0.16版本引入,之后,升级操作将不再需要单独使用mysql_upgrade工具,默认情况下--upgrade选项值为AUTO,表示自动判断是否需要执行完整的更新操作)。
老叶茶馆
2020/11/11
1.1K0
组复制要求和限制 | 全方位认识 MySQL 8.0 Group Replication
Socket代理神器客户端Proxifier+服务端ss5
在日常工作中我们经常会使用到代理, 这里记录一下Proxifier和ss5的使用,这两个工具既可以单独使用,也可以配合使用。本文讲解proxifier+ss5配合使用的场景及配置。
冯大仙
2021/11/12
2.8K0
MySQL5.7之group by语法问题
使用group by 进行分组查询时,提示异常: SELECT list is not in GROUP BY clause and contains nonaggregated column ‘XXX’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode =only_full_group_by
执笔记忆的空白
2020/12/24
8710
only_full_group_by问题而引发的对group by的深入思考
最近在项目中使用mysql的group by进行分组查询的场景比较多,其中一次遇到了一个问题,即在开发环境执行一个如下sql时是正确且可执行的,
翎野君
2023/05/12
2700
only_full_group_by问题而引发的对group by的深入思考
[MySQL] 测试where group by order by的索引问题
1. select * from test where a=xx group by b order by c 如何加索引
唯一Chat
2019/09/10
1.4K0
[MySQL] 测试where group by order by的索引问题
搭建使用Socks Server 5 服务器
收到一个这样的需求:要求访问腾讯的一个服务,无论身在哪里,都必须通过制定 ip 访问此服务,因为公司之前的 V** 是我搭的,领导找我做这个需求,但是 V** 此事并没有能适配此需求,因为我的那个 V** 只是针对内网服务才走 V** 流量,而腾讯的相关服务需要走外网流量,而且出口 ip 这个时候需要被代理成指定 ip。所以此文章针对次任务做个记录。
cuijianzhe
2022/06/14
1.5K0
搭建使用Socks Server 5 服务器
MySQL索引优化order by与group by
MySQL索引优化order by与group by 案例一 name符合最左前缀法则,但在age处断了,所以只能用到name列,索引长度202,order by也用到了index_union索引 树,通过Extra可看出。 案例二 where后符合最左前缀,所以只用到了name列,而order by处不是用的索引树index_union,因为age还没排序呢, position排序肯定是乱的,需要将结果集放在内存中排序。 案例三 如第二张图所示,在确定最左列name后,其实下面
晓果冻
2022/09/08
6140
MySQL索引优化order by与group by
group by 与 where, having以及顺序
1. GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前. HAVING语句必须在ORDER BY子句之后。(where先执行,再groupby分组;groupby先分组,having在执行。)
全栈程序员站长
2022/09/01
2.8K0
group by 与 where, having以及顺序

相似问题

在nodejs中使用导入,通常使用require

32

无法在模块之外使用导入语句- im试图在我的nodejs服务器中声明导入,但我不能

12

如何使用nodejs导入别名

16

在NodeJS中同时导入多个模块

20

使用NodeJs在Aerospike中进行批量导入

221
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文