- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Google Script 函数,它根据来自 Javascript 的值填充单元格GS 函数在 Javascript“For”循环中被调用。当我运行代码时,在“For”循环的所有增量运行完成之前,单元格不会被填充。
神奇的是,在 For 循环结束后,GS 函数开始填充相关单元格(它以某种方式记住了所有动态值)。但是,并非所有预期的单元格都得到填充,而且顺序也不正确。
尝试使用 .flush() - 没有帮助
GS函数:
function rolesInputer(role, i){
var rolesInputer = role;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var column = 3+i;
var cell = sheet.getRange(17,column);
cell.setValue(role);
}
JS函数:
function saveInput() {
var i;
for (i = 1; i <= dataEncoded; i++) {
sleep(1000);
var temprole = "role" + (i);
var roleSelect = document.getElementById(temprole);
var roleSelected = roleSelect.options[roleSelect.selectedIndex].value;
google.script.run.withSuccessHandler(roleSelected, i).rolesInputer(roleSelected, i);
alert("executed");
}
google.script.host.close();
}
最佳答案
google.script.run()
将 HTML 端的值发送到 Google Apps 脚本端.如果我的理解是正确的,这个修改怎么样?请将此视为几个答案之一。
首先,关于您的以下问题,我认为您问题的原因是google.script.run()
通过异步处理工作。
Magically, after the For loop finishes, the GS function starts populating relevant cells (somehow it remembers all the dynamic values). However, not all expected cells get populated and also not in the correct order.
为了避免这种情况,我认为您的情况有两种模式。
在此模式中,在检索到所有值后,这些值将发送到 Google Apps 脚本。当您测试该模式时,请修改如下。
function rolesInputer(values){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.getRange(17, 3, 1, values.length).setValues([values]);
}
我用了 <select>...</select>
作为示例值。在此示例中,当打开 HTML 时,脚本将运行。
<select id="role1"><option value="role1" selected>role1</option></select>
<select id="role2"><option value="role2" selected>role2</option></select>
<select id="role3"><option value="role3" selected>role3</option></select>
<select id="role4"><option value="role4" selected>role4</option></select>
<select id="role5"><option value="role5" selected>role5</option></select>
<script>
function saveInput() {
var dataEncoded = 5;
var values = [];
for (var i = 1; i <= dataEncoded; i++) {
var temprole = "role" + (i);
var roleSelect = document.getElementById(temprole);
var roleSelected = roleSelect.options[roleSelect.selectedIndex].value;
values.push(roleSelected);
}
google.script.run.withSuccessHandler(() => {google.script.host.close()}).rolesInputer(values);
}
saveInput();
</script>
在此模式中,使用 for 循环将每个值发送到 Google Apps 脚本。当您测试该模式时,请修改如下。
在此模式中,未修改 Google Apps 脚本。
在此示例中,当打开 HTML 时,将运行脚本。
<select id="role1"><option value="role1" selected>role1</option></select>
<select id="role2"><option value="role2" selected>role2</option></select>
<select id="role3"><option value="role3" selected>role3</option></select>
<select id="role4"><option value="role4" selected>role4</option></select>
<select id="role5"><option value="role5" selected>role5</option></select>
<script>
function work(roleSelected, i) {
return new Promise((resolve, reject) => {
google.script.run.withSuccessHandler(() => resolve()).rolesInputer(roleSelected, i);
});
}
async function saveInput() {
var dataEncoded = 5;
for (var i = 1; i <= dataEncoded; i++) {
var temprole = "role" + (i);
var roleSelect = document.getElementById(temprole);
var roleSelected = roleSelect.options[roleSelect.selectedIndex].value;
await work(roleSelected, i);
}
}
saveInput().then(() => google.script.host.close());
</script>
google.script.run is an asynchronous client-side JavaScript API available in HTML-service pages that can call server-side Apps Script functions.
如果这对您的情况没有用,我深表歉意。
关于javascript - 如何在 Javascript For 循环中调用 Google Script 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55639466/
我是一名优秀的程序员,十分优秀!