gpt4 book ai didi

javascript - 谷歌脚本; for循环中的函数停止它

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

Google 表格:我创建了一个脚本来检测更改的行并将更改发送到 slack。

我创建了一个 for 循环来遍历缓存中已更改的行。当调用 rowToObject() 时,for 循环在第一个条目处停止。如果我评论该函数,循环将按预期工作。

可能是什么原因?

// send all rows in cache to slack
function cacheToSlack() {
var changes = JSON.parse(cache.get('changes'));
Logger.log(changes);
Logger.log(changes.length);


for (i = 0; i < changes.length; i++) {

// get edit range
var row = changes[i];
var rowValues = sheet.getRange(row, 1, 1, headerNum).getValues()[0];
Logger.log(row);
Logger.log(rowValues);
rowToObject(rowValues);
}

}

完整代码

// created cache for saving changed rows
var cache = CacheService.getDocumentCache();

// sheet and header data
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
var headers = sheet.getRange("1:1").getValues();
var headerNum = headers[0].length;

// track changed rows
function onChange(e) {
var currentCache = cache.get('changes') || "[]";

Logger.log('current');
Logger.log(currentCache);

Logger.log('row');
Logger.log(e.range.getRow());

var rowNum = e.range.getRow();
var update = JSON.parse(currentCache).push(rowNum);
cache.put('changes', JSON.stringify(update));

Logger.log('change');
Logger.log(cache.get('changes'));
}

function testCache() {
// cache cannot save arrays
cache.put('changes', JSON.stringify([156,157]));
cacheToSlack();
}

// send all rows in cache to slack
function cacheToSlack() {
var changes = JSON.parse(cache.get('changes'));
Logger.log(changes);
Logger.log(changes.length);


for (i = 0; i < changes.length; i++) {

// get edit range
var row = changes[i];

var rowValues = sheet.getRange(row, 1, 1, headerNum).getValues()[0];
Logger.log(row);
Logger.log(rowValues);
rowToObject(rowValues);
}

}

function rowToObject(row) {
// create data object with headers as keys
var data = {};

for (i = 0; i < headerNum; ++i) {
var header = headers[0][i];
data[header] = row[i];
}

postToSlack(data);
}


function postToSlack(data) {
Logger.log(data);
// Create payload object
var payloadObject = {
blocks: [
{
type: "section",
text: {
type: "mrkdwn",
text:
"You have a new *<|Change or learning>*"
}
},
{
type: "section",
fields: [
{
type: "mrkdwn",
text: "*Channel:*\n" + data.channel
},
{
type: "mrkdwn",
text: "*Where:*\n" + data.where
},
{
type: "mrkdwn",
text: "*dateFrom:*\n" + data.dateFrom
},
{
type: "mrkdwn",
text: "*dateTo:*\n" + data.dateTo
},
{
type: "mrkdwn",
text: "*description:*\n" + data.description
},
{
type: "mrkdwn",
text: "*learning:*\n" + data.learning
},
{
type: "mrkdwn",
text: "*impact:*\n" + data.impact
}
]
}
]
};

// Stringify payload
var payload = {
payload: JSON.stringify(payloadObject)
};

// Build request
var options = {
method: "post",
payload: payload
};

// Send to Slack
Logger.log(options);
//UrlFetchApp.fetch(SLACK_WEBHOOK_POST_URL, options);
}

function clearCache() {
cache.remove('changes');
}

最佳答案

在局部函数 rowToObject 中将 i 更改为 var i 或不同的变量名称,例如 var j应该修复错误。

上述错误是由于范围问题造成的。范围是关于变量(和函数)的可访问性,并指定变量正在执行的上下文。

rowToObject 中的变量 i 尚未初始化(即设置为 var i =0 而不是 i)。 i 的初始化使 i 成为局部的而不是全局的。当 i 未在局部函数内初始化时,作用域被污染并且它被视为具有全局作用域,因为您在 cacheToSlack 中初始化了相同的变量 i

参见 MDN Reference更多

关于javascript - 谷歌脚本; for循环中的函数停止它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57709463/

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