使用Javascript循环HTML元素时获取名称和链接值
我正在为侧边栏的电子表格制作一个web应用程序 尝试处理实现以下条件的事件侦听器:使用Javascript循环HTML元素时获取名称和链接值,javascript,html,google-apps-script,Javascript,Html,Google Apps Script,我正在为侧边栏的电子表格制作一个web应用程序 尝试处理实现以下条件的事件侦听器: 选中复选框时(具有相应名称和该名称的日历链接) 选择两个日期 然后点击按钮 完成后,将从后端调用一个函数,该函数获取该名称的事件并将其记录到工作表中 我无法在循环中获取名称和日历的值。也不知道用什么方法来表达。我试着用不同的方法来处理它——没有运气 我最终将所有问题缩小到以下两个部分: 1) 如何以最佳方式将数据加载到侧栏 2) 如何在用户与这些元素交互后遍历这些数据并获取值(取决于第1部分) 如果有人能多帮
- 选中复选框时(具有相应名称和该名称的日历链接)
- 选择两个日期
- 然后点击按钮
<? for (var i = 0; i < loopNamesForSidebar().names.length; i++) { ?>
<label>
<input type="checkbox" class="filled-in check" checked="checked" />
<span>
<div class="collection">
<a href=" <?= loopNamesForSidebar().calendars[i] ?>" class="collection-item" >
<?= loopNamesForSidebar().names[i] ?>
</a>
</div>
</span>
<? } ?>
</label>
根据,您应该异步加载任何API/__;服务调用输出。我只会对普通计算/检索的数据使用模板求值,例如来自PropertiesService
、CacheService
、静态定义或基于输入参数的简单查找(即doGet
和doPost
触发函数的查询字符串/有效负载数据)。如果平均耗时超过四分之一秒,则同步使用速度太慢
因此:
假设您已正确设置了GS和HTML文件的其他部分,则.HTML的
标记之一可能如下所示:
$(document).ready(() => loadServerData()); // jQuery
function loadServerData() {
const TASK = google.script.run.withSuccessHandler(useNames); // has implicit failure handler of `console`
// Schedule this to be run every so often
const intervalMS = 10 * 60 * 1000; // 10 minutes
setInterval(sheetName => TASK.shouldRunAsync(sheetName), intervalMS, "Names");
// Invoke promptly too.
TASK.shouldRunAsync("Names");
console.log(new Date(), "Set schedule & invoked server function");
}
function useNames(serverValue, userObject) {
console.log(new Date(), "Got Value from server", serverValue);
// use the return value to do stuff, e.g.
const cbDiv = $("id of div containing checkboxes"); // jQuery
/** could add code here to read existing checkbox data, and
use that to maintain checked/unchecked state throughout loads */
cbDiv.innerHTML = serverValue.map((name, idx) => `<p id="${name}">${idx + 1}: ${name}</p>`).join("");
}
$(document).ready(()=>loadServerData());//jQuery
函数loadServerData(){
const TASK=google.script.run.withSuccessHandler(useNames);//具有`控制台'的隐式失败处理程序`
//计划每隔一段时间运行一次
常数间隔=10*60*1000;//10分钟
setInterval(sheetName=>TASK.shouldRunAsync(sheetName),interval,“name”);
//也要及时调用。
TASK.shouldRunAsync(“名称”);
log(新日期(),“设置计划和调用的服务器函数”);
}
函数useNames(serverValue、userObject){
log(新日期(),“从服务器获取值”,serverValue);
//使用返回值做一些事情,例如。
const cbDiv=$(“包含复选框的div的id”);//jQuery
/**可以在此处添加代码以读取现有复选框数据,以及
使用该选项可在整个加载过程中保持选中/未选中状态*/
cbDiv.innerHTML=serverValue.map((name,idx)=>`${idx+1}:${name}
`);
}
一如既往,请确保您非常熟悉可序列化数据类型和客户机-服务器通信模型:
其他参考文献
PropertiesService
、CacheService
、静态定义或基于输入参数的简单查找(即doGet
和doPost
触发函数的查询字符串/有效负载数据)。如果平均耗时超过四分之一秒,则同步使用速度太慢
因此:
假设您已正确设置了GS和HTML文件的其他部分,则.HTML的
标记之一可能如下所示:
$(document).ready(() => loadServerData()); // jQuery
function loadServerData() {
const TASK = google.script.run.withSuccessHandler(useNames); // has implicit failure handler of `console`
// Schedule this to be run every so often
const intervalMS = 10 * 60 * 1000; // 10 minutes
setInterval(sheetName => TASK.shouldRunAsync(sheetName), intervalMS, "Names");
// Invoke promptly too.
TASK.shouldRunAsync("Names");
console.log(new Date(), "Set schedule & invoked server function");
}
function useNames(serverValue, userObject) {
console.log(new Date(), "Got Value from server", serverValue);
// use the return value to do stuff, e.g.
const cbDiv = $("id of div containing checkboxes"); // jQuery
/** could add code here to read existing checkbox data, and
use that to maintain checked/unchecked state throughout loads */
cbDiv.innerHTML = serverValue.map((name, idx) => `<p id="${name}">${idx + 1}: ${name}</p>`).join("");
}
$(document).ready(()=>loadServerData());//jQuery
函数loadServerData(){
const TASK=google.script.run.withSuccessHandler(useNames);//具有`控制台'的隐式失败处理程序`
//计划每隔一段时间运行一次
常数间隔=10*60*1000;//10分钟
setInterval(sheetName=>TASK.shouldRunAsync(sheetName),interval,“name”);
//也要及时调用。
TASK.shouldRunAsync(“名称”);
log(新日期(),“设置计划和调用的服务器函数”);
}
函数useNames(serverValue、userObject){
log(新日期(),“从服务器获取值”,serverValue);
//使用返回值做一些事情,例如。
const cbDiv=$(“包含复选框的div的id”);//jQuery
/**可以在此处添加代码以读取现有复选框数据,以及
使用该选项可在整个加载过程中保持选中/未选中状态*/
cbDiv.innerHTML=serverValue.map((name,idx)=>`${idx+1}:${name}
`);
}
一如既往,请确保您非常熟悉可序列化数据类型和客户机-服务器通信模型:
其他参考文献
loopNamesForSidebars
,您将获得更好的性能。您的scriptlet版本在整体上对其进行了大量调用。还请注意,Scriptlet仅适用于初始HtmlTemplate
对象的计算-在加载侧边栏时不会动态计算它们。真!执行速度真慢。那么您是说使用scriptlet获取元素是一种不好的做法?感谢您的提示。这意味着您不能在客户端函数中使用在gs服务器中定义的函数loopNamesForSidebar
。您可以通过google.script.run
调用它,并在绑定到google.script.run
调用的成功处理程序中接收结果。绝对建议在初始HtmlTemplate
/HtmlOutput
-即仅从PropertiesService
或CacheService
中加载静态内容,或者根据输入的doGet
/doPost
参数进行简单计算。任何需要API/服务调用的内容都应该异步加载。为什么我一直在每个侧边栏openi上循环这些名称