Версия для слабовидящих
Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

 

= Мир MS Excel/Принудительное обновление Importxml - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин, DrMini  
Принудительное обновление Importxml
Lupus Дата: Вторник, 11.12.2018, 11:22 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Добрый день. С помощью формулы importxml тяну данные с сайтов к себе в таблицу. Но формула как то непонятно для меня обновляет данные. На одном из непроверенных источников прочитал, что она обновляет данные 2 раза в день.
Как можно заставить лист с такими формулами обновляться либо чаще, либо вручную?
Нашел описание скрипта, который надо запускать, но при его запуске система ругается на "var ss = SpreadsheetApp.openById(id)"
Скрипт вот:

/**
* Go through all sheets in a spreadsheet, identify and remove all spreadsheet
* import functions, then replace them a while later. This causes a "refresh"
* of the "import" functions. For periodic refresh of these formulas, set this
* function up as a time-based trigger.
*
* Caution: Formula changes made to the spreadsheet by other scripts or users
* during the refresh period COULD BE OVERWRITTEN.
*
* From: "link" target="_blank" href="https://stackoverflow.com/a/33875957/1677912" rel="nofollow">https://stackoverflow.com/a/33875957/1677912
*/
function RefreshImports() {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return; // Wait up to 5s for previous refresh to end.
// At this point, we are holding the lock.

var id = "YOUR-SHEET-ID";
var ss = SpreadsheetApp.openById(id);
var sheets = ss.getSheets();

for (var sheetNum=0; sheetNum<sheets.length; sheetNum++) {
var sheet = sheets[sheetNum];
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
var tempFormulas = [];
for (var row=0; row<formulas.length; row++) {
for (col=0; col<formulas[0].length; col++) {
// Blank all formulas containing any "import" function
// See "link" target="_blank" href="https://regex101.com/r/bE7fJ6/2" rel="nofollow">https://regex101.com/r/bE7fJ6/2
var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;
if (formulas[row][col].search(re) !== -1 ) {
tempFormulas.push({row:row+1,
col:col+1,
formula:formulas[row][col]});
sheet.getRange(row+1, col+1).setFormula("");
}
}
}

// After a pause, replace the import functions
Utilities.sleep(5000);
for (var i=0; i<tempFormulas.length; i++) {
var cell = tempFormulas[i];
sheet.getRange( cell.row, cell.col ).setFormula(cell.formula)
}

// Done refresh; release the lock.
lock.releaseLock();
}
}



Сообщение отредактировал Lupus - Вторник, 11.12.2018, 18:02
 
Ответить
СообщениеДобрый день. С помощью формулы importxml тяну данные с сайтов к себе в таблицу. Но формула как то непонятно для меня обновляет данные. На одном из непроверенных источников прочитал, что она обновляет данные 2 раза в день.
Как можно заставить лист с такими формулами обновляться либо чаще, либо вручную?
Нашел описание скрипта, который надо запускать, но при его запуске система ругается на "var ss = SpreadsheetApp.openById(id)"
Скрипт вот:
[vba]
/*** Go through all sheets in a spreadsheet; identify and remove all spreadsheet* import functions; then replace them a while later. This causes a "refresh"* of the "import" functions. For periodic refresh of these formulas; set this* function up as a time-based trigger.** Caution: Formula changes made to the spreadsheet by other scripts or users* during the refresh period COULD BE OVERWRITTEN.** From: https://stackoverflow.com/a/33875957/1677912 */function RefreshImports() {var lock = LockService.getScriptLock();if (undefinedlock.tryLock(5000)) return; // Wait up to 5s for previous refresh to end.// At this point; we are holding the lock.var id = "YOUR-ЛИСТ-ID";var ss = SpreadsheetApp.openById(id);var sheets = ss.getSheets();for (var sheetNum=0; sheetNum<sheets.length; sheetNum++) {var sheet = sheets[sheetNum];var dataRange = sheet.getDataRange();var formulas = dataRange.getFormulas();var tempFormulas = [];for (var row=0; row<formulas.length; row++) {for (col=0; col<formulas[0].length; col++) {// Blank all formulas containing any "import" function// See https://regex101.com/r/bE7fJ6/2 var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;if (formulas[row][col].search(re) undefined== -1 ) {tempFormulas.push({row:row+1;col:col+1;formula:formulas[row][col]});sheet.getRange(row+1; col+1).setFormula("");}}}// After a pause; replace the import functionsUtilities.sleep(5000);for (var i=0; i<tempFormulas.length; i++) {var cell = tempFormulas[i];sheet.getRange( cell.row; cell.col ).setFormula(cell.formula)}// Done refresh; release the lock.lock.releaseLock();}}
[/vba]

Автор - Lupus
Дата добавления - 11.12.2018 в 11:22
sboy Дата: Вторник, 11.12.2018, 12:03 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
Цитата Lupus, 11.12.2018 в 11:22, в сообщении № 1 ( писал(а)):
var id = "YOUR-SHEET-ID"

Оформите код в теги # на панели редактирования поста


Яндекс: 410016850021169
 
Ответить
СообщениеДобрый день.
Цитата Lupus, 11.12.2018 в 11:22, в сообщении № 1 ( писал(а)):
var id = "YOUR-SHEET-ID"

Оформите код в теги # на панели редактирования поста

Автор - sboy
Дата добавления - 11.12.2018 в 12:03
krosav4ig Дата: Среда, 12.12.2018, 17:10 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2348
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Я тут немного поизвращался над кодом

function RefreshImports() {
    var s=SpreadsheetApp,
        e=s.getUi(),
        t=e.prompt("","Укажите Spreadsheet id",e.ButtonSet.OK_CANCEL);
    if(t.getSelectedButton()==e.Button.OK) {
        var r=t.getResponseText(),
            n=LockService.getScriptLock();
        n.tryLock(5e3) && (SpreadsheetApp.openById(r).getSheets().forEach(function(t){
            var r=/.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi,
                n=[t.getDataRange()].map(function(e){
                    return {r:e.getRow(),c:e.getColumn(),f:e.getFormulas()}
                })[0],
                e = [].concat.apply([],n.f.map(function(e,r){
                    return e.map(function(e,t){ return {f:e,r:r+n.c,c:t+n.r}})
                })).filter(function(e){return -1!==e.f.search(r)});
            e.forEach(function(e){t.getRange(e.r,e.c).setFormula("")});
            Utilities.sleep(5e3);
            e.forEach(function(e){t.getRange(e.r,e.c).setFormula(e.f)})
        }),s.flush(),n.releaseLock())
    }
}



email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Среда, 12.12.2018, 19:37
 
Ответить
СообщениеЯ тут немного поизвращался над кодом [vba]
function RefreshImports() {    var s=SpreadsheetApp;        e=s.getUi();        t=e.prompt("";"Укажите Spreadsheet id";e.ButtonSet.OK_CANCEL);    if(t.getSelectedButton()==e.Button.OK) {        var r=t.getResponseТext();            n=LockService.getScriptLock();        n.tryLock(5e3) && (SpreadsheetApp.openById(r).getSheets().forEach(function(t){            var r=/.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;                n=[t.getDataRange()].map(function(e){                    return {r:e.getRow();c:e.getColumn();f:e.getFormulas()}                })[0];                e = [].concat.apply([];n.f.map(function(e;r){                    return e.map(function(e;t){ return {f:e;r:r+n.c;c:t+n.r}})                })).filter(function(e){return -1undefined==e.f.search(r)});            e.forEach(function(e){t.getRange(e.r;e.c).setFormula("")});            Utilities.sleep(5e3);            e.forEach(function(e){t.getRange(e.r;e.c).setFormula(e.f)})        });s.flush();n.releaseLock())    }}
[/vba]

Автор - krosav4ig
Дата добавления - 12.12.2018 в 17:10
  • Страница 1 из 1
  • 1
Поиск:

Рейтинг@Mail.ru Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!