2014-12-18 4 views
0

У меня есть небольшой скрипт, и я пытаюсь написать одно значение из «Лист 1» в «Лист 2». Подождите, пока результаты загрузятся и сравните ячейки, чтобы увидеть, превышает ли это 10% или нет. У меня есть некоторые функции =importhtml в электронной таблице, и требуется много времени для загрузки. Я пробовал спать, утилизацию сна и флеш. Никто не работает, может быть, потому, что я мог бы поставить его в ту область ..Скрипт приложения Google Spreadsheet не будет ждать загрузки результатов

function compareCells() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var listSheet = ss.getSheetByName('Stocks'); 
    var dataSheet = ss.getSheetByName('Summary'); 
    var listSheetLastRow = listSheet.getLastRow(); 
    var currRow = 1; 
    for (i = 1; i <= listSheetLastRow; i++) { 
     if (listSheet.getRange(1, 3).getValue() == 'asd') { 
      var ticker = listSheet.getRange(currRow, 1).getValue(); 
      dataSheet.getRange(5, 4).setValue(ticker); 
      var value1 = dataSheet.getRange(15, 4).getValue(); 
      var value2 = dataSheet.getRange(22, 4).getValue(); 
      SpreadsheetApp.flush(); 
      if (value1 > 0.10 && value2 > 0.10) { 
       listSheet.getRange(currRow, 8).setValue('True'); 
       listSheet.getRange(currRow, 9).setValue(value1); 
       listSheet.getRange(currRow, 10).setValue(value2); 
      } else { 
       listSheet.getRange(currRow, 8).setValue('False'); 
      } 
     } else { 
      Browser.msgBox('Script aborted'); 
      return null; 
     } 
     currRow++; 
    } 
} 
+0

Зачем стоит [excel]? – pnuts

+0

Пожалуйста, напишите более подробную информацию о том, какой диапазон значений импортируется с помощью функции '= importhtml', а также если вы можете добавить таблицу с данными для анализа. – KRR

+0

Я импортирую финансовые отчеты компаний. Я создал метод оценки для себя. Я бы хотел, чтобы эта оценка проводилась на всем рынке.Поэтому, по сути, я делаю это, у меня будет лист со списком символов биржевого тикера, я хотел, чтобы сценарий принимал каждый символ в соответствующее поле, а затем ожидал, что финансовые отчеты будут импортированы, вычисления (примерно 10 секунд), а затем проверьте, соответствует ли запас прочности 10%. Если это так, то он пишет true, и переходит к следующему, который пишет false. Дайте мне знать, если вы хотите это увидеть. – user3527050

ответ

2

Если это не так важно, что вы используете функцию = IMPORTHTML() в листе, самый простой способ сделать это желание использовать UrlFetchApp в сценарии приложений. Получение данных таким образом приведет к блокировке вашего сценария до тех пор, пока не будет возвращен ответ HTML. Вы также можете создать триггер, основанный на времени, поэтому ваши данные всегда свежи, и пользователю не придется ждать выборки URL-адресов при просмотре вашего листа.

Как только вы получите ответ HTML, вы можете выполнить всю ту же обработку, что и в Sheet1 в своем скрипте. Если это не будет работать, потому что у вас есть сложная обработка в Лист1, вы можете:

  1. использование UrlFetchpApp.fetch('http://sample.com/data.html') получить ваши данные
  2. записать данные Лист1
  3. вызова SpreadsheetApp.flush(), чтобы заставить писать и все, что последующая обработка
  4. действуйте в вашем примере выше

Реализуя эти шаги последовательно в сценарии вы гарантировать, что ваши последующие шаги не произойдет до го данных.

+0

Вы знаете, что это не плохая идея, но дело в том, что я слишком зашел с этим методом. Я импортирую финансовые отчеты примерно из 4 разных URL-адресов, после того как они загружаются, есть еще один лист, который принимает соответствующие данные и извлекает его, а затем другой лист, который фактически выполняет вычисления. Если кто-то действительно заинтересован в просмотре ig, пожалуйста, дайте мне знать. Может быть, это облегчит ситуацию. – user3527050

+0

Я все еще не уверен, почему вы не могли просто сделать URL-адрес Fetch, чтобы сделать «импорт финансовых отчетов из 4 URL-адресов» частью того, что вы только что описали. Если вы выберете, то напишите в том же скрипте, который обрабатывает вышеприведенную обработку, вы получаете гарантию того, что данные есть там, где выполняется скрипт, и вам не нужно ничего менять. – jjjjoe

+0

Ну, честно говоря, я не очень разбираюсь в написании сценариев. Я знаю функции excel и действительно должен был многому научиться, используя листы Google. Не могли бы вы объяснить больше? Другая причина, по которой я не использовал URLFetch, был в том, что, если я не использую скрипт, и я просто хотел просмотреть финансовые данные ... – user3527050

1

В случае, если вы получаете эти два значения (

var value1 = dataSheet.getRange(15, 4).getValue(); 
var value2 = dataSheet.getRange(22, 4).getValue(); 

) после =importhtml вызова, вы должны добавить функцию сна до этих двух строк кода.

Вы также можете иметь петлю, пока не получите значения в диапазоне от =importhtml и добавьте некоторый сон в цикле. Также обратите внимание, что с апреля 2014 года ограничение script runtime составляет 6 минут.

Я также нашел это link который может быть полезен.

Надеюсь, что это поможет!

1

У меня была аналогичная проблема, но придумал решение, которое использует цикл while, который заставляет скрипт ждать, пока не будет добавлен по крайней мере 1 дополнительный столбец или 1 дополнительная строка. Таким образом, для этой работы формула должна добавлять данные, по крайней мере, в одну дополнительную ячейку, отличную от той, которая содержит формулу, и ей необходимо расширить диапазон данных листа (количество строк или столбцов), например, добавив формулу в формулу конец листа, который выглядит так, как вы делаете. Каждые 0,5 секунды в течение 10 секунд он проверяет, добавлены ли дополнительные ячейки.

dataSheet.getRange(5, 4).setValue(ticker);    
var wait = 0; 
var timebetween = 500; 
var timeout = 10000; 
var lastRow = dataSheet.getLastRow(); 
var lastColumn = dataSheet.getLastColumn(); 
while (dataSheet.getLastColumn() <= lastColumn && dataSheet.getLastRow() <= lastRow){ 
    Utilities.sleep(timebetween); 
    wait += timebetween; 
    if (wait >= timeout){ 
    Logger.log('ERROR: Source data for ' + ticker + ' still empty after ' + timeout.toString() + ' seconds.'); 
    throw new Error('Source data for ' + ticker + ' still empty after ' + timeout.toString() + ' seconds.'); 
    } 
} 
Смежные вопросы