#javascript
Вопрос:
Я не программист, но я могу читать и понимать логику, лежащую в основе кода. Чтобы отслеживать эффективность моего портфолио, я использовал скрипт, который нашел в Интернете и который позволяет мне автоматически обновлять цены. Я адаптировал сценарий под свои требования: мне не нужна была панель мониторинга и уведомления по электронной почте о полях. Кроме того, я добавил триггер, основанный на времени, который автоматически обновляет файл и цифры каждые 5 минут.
Однако по какой-то причине файл не обновляется автоматически каждые 5 минут и не возвращает сообщение: «Тарифы были обновлены в последний раз ВОВРЕМЯ».
Кроме того, сравнивая мой лист с оригиналом (ссылка ниже), я заметил, что это может быть связано со следующим:
- Я удалил BTC с того места, где он был расположен.
- Я удалил содержимое столбца A, строки 2 и 3, которые содержали формулы: =СОВПАДЕНИЕ(«BTC», B:B, 0) / =СОВПАДЕНИЕ(«ETH», B:B,0)
- Я удалил эту формулу из столбца D, строка 27: =КОСВЕННЫЙ(АДРЕС(A2 1,9))
Исходный лист и сценарий: https://docs.google.com/электронные таблицы/d/1t3tX22qEIK0HmgXgwiI0kxCLkBWFSSfusGGvxULWO1I/редактировать
Любая помощь будет признательна 🙂
Вот код:
function RefreshImports() {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return;
var id = "1IVUjHDRxJiWw8H1LYY_IY0_ydwZ4F3qfSHKcKLa78Bw";
var ss = SpreadsheetApp.openById(id);
var sheet = ss.getSheetByName("Profit/Loss");
var rowRef = sheet.getRange(2,1).getValue();
var active = sheet.getRange(8 rowRef,8).getValue();
if (active == 1) {
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
var content = "";
var now = new Date();
var time = now.getTime();
var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range|regex|json)(.*/gi;
var re2 = /((?|amp;)(update=[0-9]*))/gi;
for (var row=0; row<formulas.length; row ) {
for (var col=0; col<formulas[0].length; col ) {
content = formulas[row][col];
if (content != "") {
var match = content.search(re);
if (match !== -1 ) {
var url = sheet.getRange(row 1, col).getValue();
if (url != "") {
var updatedContent = url.toString().replace(re2,"?update=" time);
if (updatedContent == url) {
// No querystring exists yet in url
updatedContent = url.toString() "?update=" time;
}
// Update url in formula with querystring param
sheet.getRange(row 1, col).setValue(updatedContent);
Utilities.sleep(250);
}
}
}
}
}
// Done refresh; release the lock.
lock.releaseLock();
var dateStr = now.toLocaleDateString("en-GB", { timeZone: 'Lebanon/Beirut' });
var timeStr = now.toLocaleTimeString("en-GB", { timeZone: 'Lebanon/Beirut' });
// Show last updated time on sheet somewhere
sheet.getRange(4 rowRef,2).setValue("Rates were last updated at " timeStr);
}
}
function importRegex(url, regexInput) {
var output = '';
var fetchedUrl = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
if (fetchedUrl) {
var html = fetchedUrl.getContentText();
if (html.length amp;amp; regexInput.length) {
output = html.match(new RegExp(regexInput, 'i'))[1];
}
}
// Grace period to not overload
Utilities.sleep(1000);
return unescapeHTML(output);
}
function importJson(address) {
var output = '';
var fetchedUrl = UrlFetchApp.fetch('https://api.pancakeswap.info/api/v2/tokens/' address, {muteHttpExceptions: true});
if (fetchedUrl) {
var json = JSON.parse(fetchedUrl.getContentText());
if (json) {
output = json.data.price.substring(0,15);
}
}
// Grace period to not overload
Utilities.sleep(1000);
return unescapeHTML(output);
}
var htmlEntities = {
nbsp: ' ',
cent: '¢',
pound: '£',
yen: '¥',
euro: '€',
dollar: '
Ответ №1:
У вас все еще есть "rowRef" в вашем скрипте, который привязан к относительному положению цены BTC. Я очистил ваш сценарий, и вот, пожалуйста, попробуйте приведенный ниже сценарий и дайте мне знать.
function RefreshImports() {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return;
var id = "1IVUjHDRxJiWw8H1LYY_IY0_ydwZ4F3qfSHKcKLa78Bw";
var ss = SpreadsheetApp.openById(id);
var sheet = ss.getSheetByName("Profit/Loss");
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
var content = "";
var now = new Date();
var time = now.getTime();
var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range|regex|json)(.*/gi;
var re2 = /((?|amp;)(update=[0-9]*))/gi;
for (var row=0; row<formulas.length; row ) {
for (var col=0; col<formulas[0].length; col ) {
content = formulas[row][col];
if (content != "") {
var match = content.search(re);
if (match !== -1 ) {
var url = sheet.getRange(row 1, col).getValue();
if (url != "") {
var updatedContent = url.toString().replace(re2,"?update=" time);
if (updatedContent == url) {
// No querystring exists yet in url
updatedContent = url.toString() "?update=" time;
}
// Update url in formula with querystring param
sheet.getRange(row 1, col).setValue(updatedContent);
Utilities.sleep(250);
}
}
}
}
}
// Done refresh; release the lock.
lock.releaseLock();
//var dateStr = now.toLocaleDateString("en-GB", { timeZone: 'Lebanon/Beirut' });
var timeStr = now.toLocaleTimeString("en-GB", { timeZone: 'Lebanon/Beirut' });
// Show last updated time on sheet somewhere
sheet.getRange(14,2).setValue("Rates were last updated at " timeStr);
}
function importRegex(url, regexInput) {
var output = '';
var fetchedUrl = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
if (fetchedUrl) {
var html = fetchedUrl.getContentText();
if (html.length amp;amp; regexInput.length) {
output = html.match(new RegExp(regexInput, 'i'))[1];
}
}
// Grace period to not overload
Utilities.sleep(1000);
return unescapeHTML(output);
}
function importJson(address) {
var output = '';
var fetchedUrl = UrlFetchApp.fetch('https://api.pancakeswap.info/api/v2/tokens/' address, {muteHttpExceptions: true});
if (fetchedUrl) {
var json = JSON.parse(fetchedUrl.getContentText());
if (json) {
output = json.data.price.substring(0,15);
}
}
// Grace period to not overload
Utilities.sleep(1000);
return unescapeHTML(output);
}
var htmlEntities = {
nbsp: ' ',
cent: '¢',
pound: '£',
yen: '¥',
euro: '€',
dollar: '
,
copy: '©',
reg: '®',
lt: '<',
gt: '>',
mdash: '–',
ndash: '-',
quot: '"',
amp: 'amp;',
apos: '''
};
function unescapeHTML(str) {
return str.replace(/amp;([^;] );/g, function (entity, entityCode) {
var match;
if (entityCode in htmlEntities) {
return htmlEntities[entityCode];
} else if (match = entityCode.match(/^#x([da-fA-F] )$/)) {
return String.fromCharCode(parseInt(match[1], 16));
} else if (match = entityCode.match(/^#(d )$/)) {
return String.fromCharCode(~~match[1]);
} else {
return entity;
}
});
};
Ответ №1:
У вас все еще есть "rowRef" в вашем скрипте, который привязан к относительному положению цены BTC. Я очистил ваш сценарий, и вот, пожалуйста, попробуйте приведенный ниже сценарий и дайте мне знать.
,
copy: '©',
reg: '®',
lt: '<',
gt: '>',
mdash: '–',
ndash: '-',
quot: '"',
amp: 'amp;',
apos: '''
};
function unescapeHTML(str) {
return str.replace(/amp;([^;] );/g, function (entity, entityCode) {
var match;
if (entityCode in htmlEntities) {
return htmlEntities[entityCode];
} else if (match = entityCode.match(/^#x([da-fA-F] )$/)) {
return String.fromCharCode(parseInt(match[1], 16));
} else if (match = entityCode.match(/^#(d )$/)) {
return String.fromCharCode(~~match[1]);
} else {
return entity;
}
});
};
,
copy: ‘©’,
reg: ‘®’,
lt: ‘<‘,
gt: ‘>’,
mdash: ‘–’,
ndash: ‘-‘,
quot: ‘»‘,
amp: ‘amp;’,
apos: »’
};
function unescapeHTML(str) {
return str.replace(/amp;([^;] );/g, function (entity, entityCode) {
var match;
if (entityCode in htmlEntities) {
return htmlEntities[entityCode];
} else if (match = entityCode.match(/^#x([da-fA-F] )$/)) {
return String.fromCharCode(parseInt(match[1], 16));
} else if (match = entityCode.match(/^#(d )$/)) {
return String.fromCharCode(~~match[1]);
} else {
return entity;
}
});
};
Ответ №1:
У вас все еще есть «rowRef» в вашем скрипте, который привязан к относительному положению цены BTC. Я очистил ваш сценарий, и вот, пожалуйста, попробуйте приведенный ниже сценарий и дайте мне знать.