google 电子表格在追加新行时出现错误
google spreadsheets bug during appending new rows
脚本必须将有关调用详细信息的回发信息从 zvonok.com 记录到 google 电子表格。我有只将行追加到电子表格的函数 - 没有更新或修改 代码中的任何单元格,并且在少数手动测试调用期间,行已追加正确,但是当我的客户开始他通常的调用时活动、电话和回发经常接连发生,最后一行的值开始变化几次,在某些情况下会留下奇怪的值
第一次看到这样的行为做短视频记录:
https://youtu.be/0_H_mVAbp4g
这里有一列有奇怪的值
- 2103052006092385
- 2,10305E+15
- 210305412464544
我从 248 行中找到了 9 个案例。
客户从他的用户柜中向我展示了 excel,总共进行了 5649 次调用,因此在 google 电子表格中必须是 5649 行而不是 248 行。
function getJsonFromUrl(url) {
var query = url;
var result = {};
if (query == undefined){
return result;
}
query.split("&").forEach(function(part) {
var item = part.split("=");
result[item[0]] = decodeURIComponent(item[1]);
});
return result;
}
function doGet(e){
const ctCompl = 'ct_completed';
var doc = SpreadsheetApp.openById(SHEET_KEY);
var sheet = doc.getSheetByName(SHEET_NAME);
var row = [];
if(typeof e !== undefined){
mArr = getJsonFromUrl(e.queryString);
for (i in mArr) if( i == ctCompl) {
row.push(convTimeLong(mArr[i]));
} else
row.push(mArr[i]);
sheet.appendRow(row);
} else {
sheet.appendRow(['e undefined!']);
}
SpreadsheetApp.flush();
return handleResponse(e)
}
function convTimeLong(dateTime) {
let d = new Date();
let dt=dateTime.replace('+', 'T');
try {
var res = Utilities.formatDate(d,"GMT+2", "dd.MM.yyyy HH:mm");
return res
} catch(e){
return dateTime; }
}
执行仪表板到处显示状态“已完成”,执行时间最长 - 1.688 秒
客户已将两次通话之间的延迟设置为 5 秒,现在我不知道是否设置延迟后回发丢失的百分比有所降低,但它仍然很高。
一般来说,使用 Google 表格作为数据库不是一个好主意。它不是为此而设计的,所以它可能会非常糟糕。使用适当的数据库将使一切变得非常容易。如果您使用 spreadsheet 来处理数据,我建议您使用导入数据的函数,例如 IMPORTXML
(see reference).
话虽如此,如果您坚持使用表格,您可以尝试使用锁:
function appendRow(sheet, row) {
const lock = LockService.getScriptLock()
while (!lock.tryLock(100000)) /* Spin the lock until it gets aquired */;
try {
sheet.appendRow(row)
SpreadsheetApp.flush()
} finally {
lock.releaseLock()
}
}
要使用它,您只需传递 sheet 和要添加的值:sheet.appendRow(row)
到 appendRow(sheet, row)
。
它将确保条目不会被覆盖。请注意,这会大大降低代码速度,如果有很多请求,脚本可能会超时。
脚本必须将有关调用详细信息的回发信息从 zvonok.com 记录到 google 电子表格。我有只将行追加到电子表格的函数 - 没有更新或修改 代码中的任何单元格,并且在少数手动测试调用期间,行已追加正确,但是当我的客户开始他通常的调用时活动、电话和回发经常接连发生,最后一行的值开始变化几次,在某些情况下会留下奇怪的值
第一次看到这样的行为做短视频记录: https://youtu.be/0_H_mVAbp4g
这里有一列有奇怪的值
- 2103052006092385
- 2,10305E+15
- 210305412464544
我从 248 行中找到了 9 个案例。 客户从他的用户柜中向我展示了 excel,总共进行了 5649 次调用,因此在 google 电子表格中必须是 5649 行而不是 248 行。
function getJsonFromUrl(url) {
var query = url;
var result = {};
if (query == undefined){
return result;
}
query.split("&").forEach(function(part) {
var item = part.split("=");
result[item[0]] = decodeURIComponent(item[1]);
});
return result;
}
function doGet(e){
const ctCompl = 'ct_completed';
var doc = SpreadsheetApp.openById(SHEET_KEY);
var sheet = doc.getSheetByName(SHEET_NAME);
var row = [];
if(typeof e !== undefined){
mArr = getJsonFromUrl(e.queryString);
for (i in mArr) if( i == ctCompl) {
row.push(convTimeLong(mArr[i]));
} else
row.push(mArr[i]);
sheet.appendRow(row);
} else {
sheet.appendRow(['e undefined!']);
}
SpreadsheetApp.flush();
return handleResponse(e)
}
function convTimeLong(dateTime) {
let d = new Date();
let dt=dateTime.replace('+', 'T');
try {
var res = Utilities.formatDate(d,"GMT+2", "dd.MM.yyyy HH:mm");
return res
} catch(e){
return dateTime; }
}
执行仪表板到处显示状态“已完成”,执行时间最长 - 1.688 秒 客户已将两次通话之间的延迟设置为 5 秒,现在我不知道是否设置延迟后回发丢失的百分比有所降低,但它仍然很高。
一般来说,使用 Google 表格作为数据库不是一个好主意。它不是为此而设计的,所以它可能会非常糟糕。使用适当的数据库将使一切变得非常容易。如果您使用 spreadsheet 来处理数据,我建议您使用导入数据的函数,例如 IMPORTXML
(see reference).
话虽如此,如果您坚持使用表格,您可以尝试使用锁:
function appendRow(sheet, row) {
const lock = LockService.getScriptLock()
while (!lock.tryLock(100000)) /* Spin the lock until it gets aquired */;
try {
sheet.appendRow(row)
SpreadsheetApp.flush()
} finally {
lock.releaseLock()
}
}
要使用它,您只需传递 sheet 和要添加的值:sheet.appendRow(row)
到 appendRow(sheet, row)
。
它将确保条目不会被覆盖。请注意,这会大大降低代码速度,如果有很多请求,脚本可能会超时。