gpt4 book ai didi

javascript - 在 .gs 函数中提示用户输入范围,将数组传递给 html 脚本并重新关注 HTML 对话框

转载 作者:行者123 更新时间:2023-11-30 15:09:00 25 4
gpt4 key购买 nike

我有一个 google 表格,我想提示用户选择范围以获取信息,将其存储到一个数组中,然后在 html 弹出窗口中创建一个图表。我已经阅读了一些关于 google.script.run 的内容功能,并了解如果最后没有 withSuccessHandler(HTMLFunction).FunctionToCall() 语法,HTML 脚本将移至下一行。我在下面有一个 .gs 文件和一个 .html 文件,当我刚在我的 .gs 函数中输入一个静态数组时,我能够让图表工作。然而,我似乎在努力解决如何将焦点返回到编辑器以获得范围,然后将带有图表的 HTML 对话框恢复并将正确的数据获取到绘制图表的函数。我看到了here我可以使用 google.script.host 调用 editor.focus() 函数,这样用户现在可以选择单元格,但我似乎无法在不重新调用 HTML 文件的情况下将焦点返回到 HTML 弹出窗口.这是我的 .gs 函数:

function RetrieveData(){
var ss = SpreadsheetApp.getActive();
var sheets = ss.getSheets();
var s = sheets[1];
var UI = SpreadsheetApp.getUi();
var response = UI.prompt("Please enter the first cell in the category").getResponseText();
var ir = s.getRange(response);
var n= 0;
var stored = [];
stored.push(["Income Category", "Frequency"]);
while (ir.getValue()!= "") {
n = n +1;
ir = ir.offset(1, 0);
}
ir = ir.offset(-n,0)

for(i =0; i<n;i++) {
stored.push([ir.getValue(),ir.offset(n+2,0).getValue()]);
ir = ir.offset(1, 0);
}
return stored;
}

这是我在正文中的 html(Stack Overflow 有点严格,所以我不打算麻烦地显示所有 HTML;这只是在正文中,它是与.gs 文件):

google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(getdata);
function getdata() {
google.script.run.withSuccessHandler(drawChart).RetrieveData();
google.script.host.editor.focus();
}
function drawChart(stored) {
//This apparently shows a log of the object
//console.log(stored);
var data = new google.visualization.arrayToDataTable(stored);
console.log(data);
var options = {'title':'Income',
'width':400,
'height':300,
'is3d':true};
// Instantiate and draw our chart, passing in some options.
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
google.script.run.withSuccessHandler(drawChart).RetrieveData();
}

我尝试的最后一件事是调用 SpreadsheetApp.getUi().showModalDialog(html, "Title") 再次运行,但没有再次调用 html 文件,并创建一个无限循环,我似乎没有办法做到这一点。知道如何实现吗?

最佳答案

这是一个使用无模式对话框选择范围的简单示例。只需添加一些额外的功能即可达到很好的效果。

代码.gs:

function selRange()//run this to get everything started.  A dialog will be displayed that instructs you to select a range.
{
var output=HtmlService.createHtmlOutputFromFile('pickRange').setWidth(300).setHeight(200).setTitle('Select A Range');
SpreadsheetApp.getUi().showModelessDialog(output, 'Range Selector');
}

function selCurRng()
{
var sso=SpreadsheetApp.getActive();
var sh0=sso.getActiveSheet();
var rg0=sh0.getActiveRange();
var rng0A1=rg0.getA1Notation();
rg0.setBackground('#777700');
return rng0A1;
}

function clrRange(range)
{
var sso=SpreadsheetApp.getActive();
var sh0=sso.getActiveSheet();
var rg0=sh0.getRange(range);
rg0.setBackground('#ffffff');
}

pickRange.html

<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
var grange='';
function selectRange()
{
$('#btn1').prop('disabled',true);
$('#btn2').prop('disabled',false);
google.script.run
.withSuccessHandler(setResponse)
.selCurRng();
}
function setResponse(r)
{
grange=r;
var msg='You have select the range ' + r;
$('#instr').css('display','none');
$('#rsp').text(msg);
}
function clearAndClose()
{
google.script.run.clrRange(grange);
google.script.host.close();

}
console.log('My Code');
</script>
</head>
<body>
<div id="rsp"></div>
<div id="instr">Please select your desired range.</div>
<input type="button" id="btn1" value="Range Selected" onClick="selectRange();" />
<br /><input type="button" id="btn2" value="close" onClick="clearAndClose();"; disabled="true" />
</body>
</html>

关于javascript - 在 .gs 函数中提示用户输入范围,将数组传递给 html 脚本并重新关注 HTML 对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45382359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com