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

Вход

Регистрация

Напомнить пароль

 

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

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

Excel 2016
Добрый день. С помощью формулы 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 (!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 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();
}
}
[/vba]


Сообщение отредактировал 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 (!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 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();
}
}
[/vba]

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

Excel 2010
Добрый день.
var id = "YOUR-SHEET-ID"

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


Яндекс: 410016850021169
 
Ответить
СообщениеДобрый день.
var id = "YOUR-SHEET-ID"

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

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

Excel 2007,2010,2013
Я тут немного поизвращался над кодом [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.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())
    }
}
[/vba]


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.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())
    }
}
[/vba]

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

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