2013-09-30 3 views
0

Я новичок в редакторе сценариев в электронной таблице google и не очень много программиста. Я уже давно работаю с документами google, и это стало важным инструментом в моей повседневной деятельности. То, что я пытаюсь сделать, заключается в следующем: Ищите целый документ (с несколькими листами, такими как «1», «2», «3» и т. Д., Что соответствует количеству дней в месяце.), и если столбец 7 показывает определенное значение (в моем случае это будет RECEBER), потяните все данные в эту строку и напишите на лист, созданный для этой цели. Что происходит, так это то, что я использую событие onEdit для запуска этой функции. На первый взгляд, это было бы идеально, но в моем случае я копирую много данных из других электронных таблиц, а команда paste не вызывает событие onEdit. Вместо этого мне нужно вручную отредактировать ячейку, чтобы скопировать эту строку на другой лист. Я мог бы запустить его только один раз, как только все дни месяца были заполнены, и остались какие-то изменения, но я действительно хочу сделать это немедленно, как только содержимое будет вставлено в электронную таблицу.вытащить данные на конкретный лист в документе

Существует еще одна проблема с моим кодом, она должна быть пригодной и адаптирована ко всем другим листам, поскольку предложение if выполняет только полную операцию, если активный лист равен «1». Во всяком случае, я считаю, что это простое решение.

Вот код, нашел в сети, который уже взял меня на полпути:

function onEdit(event) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = event.source.getActiveSheet(); 
    var r = event.source.getActiveRange(); 

    if(s.getName() == "1" && r.getColumn() == 7 && r.getValue() == "RECEBER") { 
    var row = r.getRow(); 
    var numColumns = s.getLastColumn(); 
    var targetSheet = ss.getSheetByName("money"); 
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
    s.getRange(row, 1, 1, numColumns).copyTo(target); 
    } 
} 

Я ценю помощь, которую вы можете дать. Спасибо заранее.

Диого Соуза

- Обновлен 12Oct -

Я изменил логику на моем коде, и, как patt0 предложил, я запустить скрипт из меню, созданного. Я пробовал адаптировать код, но я считаю, что некоторые разделы не соответствуют действительности. Скрипт работает, но ничего не пишет на моем целевом листе.

вот код:

function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var menuEntries = [ {name: "RECEBER", functionName: "RECEBER"} ]; 
    ss.addMenu("Scripts", menuEntries); 
} 

function mustBeCopied(sheetName) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheetNumber = parseInt(sheetName); 
    if (sheetNumber <=31 && sheetNumber >=1) 
    return true; 
    return false; 
} 

function RECEBER() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = ss.getActiveSheet(); 
    var r = ss.getActiveRange(); 
    if(mustBeCopied(s.getName()) && r.getColumn() == 7 && r.getValue() == "RECEBER") { 
    var row = r.getRow(); 
    var numColumns = s.getLastColumn(); 
    var targetSheet = ss.getSheetByName("money"); 
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
    s.getRange(row, 1, 1, numColumns).copyTo(target); 
    } 
} 

функция Mustbecopied, от того, что я верю, только устанавливает диапазон листов (от 1 до 31) право; функция RECEBER будет определять, будет ли значение в столбце 7 удовлетворять условию (RECEBER), чтобы он мог получить всю информацию о строке и переместить ее на целевой лист.

Возможно, проблема в том, что проблема с активным листом. Могу ли я использовать ее в своих интересах и применить сценарий к выбранному листу? Кроме того, если бы я мог иметь оба варианта (применить его к выбранному листу или всему документу), это будет здорово и упростит мою повседневную работу!

ответ

0

Ваш вопрос действительно несколько вопросов в одном, и я буду заниматься только со второй частью, первая часть имеет довольно много измерений (как эффективно обновлять сводные листы), которые мы можем обсудить с другим вопросом.

Для того, чтобы определить, если необходимо скопировать данные в конкретном листе, можно создать простую функцию, которая возвращает логическое значение, если лист удовлетворяет условию, что это число между 1 и 31.

function mustBeCopied(sheetName) { 
    var sheetNumber = parseInt(sheetName); 
    if (sheetNumber <=31 && sheetNumber >=1) 
    return true; 
    return false; 
} 

Помните, что лист с именем «28.7» удовлетворяет условию.

Первая строка вашего onEdit() сценарий будет выглядеть как этот

if(mustBeCopied(s.getName()) && r.getColumn() == 7 && r.getValue() == "RECEBER") 

Позвольте мне знать, если это работает для вас.

--- 14 октября ---

Насколько я понимаю, вопрос, который остается, в том, что, когда ваша функция работала onEdit, диапазон (активный диапазон) был ячейка, просто отредактированной , Таким образом, диапазон будет только одной ячейкой.

Для того, чтобы сума бежать, вы должны выделить каждую ячейку для копирования до выбора меню, которое было бы утомительно, мягко говоря,

Далее, если у вас есть определенный диапазон для копирования, что на каждой странице одинаково, мы можем копировать этот диапазон каждый раз или перебирать каждую строку в столбце, чтобы искать «RECEBER» и копировать эти строки.

Далее Мы можем попытаться обновить вашу функцию, чтобы итерация по всем листам была много похожа на это.

var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
for (var i = 0; i < sheets.length; i::) { 
    var s = sheets[i]; 
    if (mustBeCopied(s.getName()) { 
     var range = s.getRange(someRow, 7, someNumOfRows); 
     for (var j = 1; j <= someNumOfRows; j++) { 
      if (range.getCell(j,1).getValue() == "RECEBER") { 
       //YOUR COPY CODE 
      } 
     } 
    } 
} 

Дайте мне знать, как это работает.

+0

Благодарим за быстрый ответ. –

+0

Я использовал ваш код, и он работает безупречно. Теперь он может адаптироваться к любому диапазону листов, который я хочу, без необходимости менять код каждый раз, когда я хочу применить его к новому листу. Я просто думаю, что событие onEdit должно отвечать всякий раз, когда я вставляю новый контент в свой документ, взятый из других электронных таблиц. По мере ввода новых данных его следует интерпретировать как эффективное редактирование листа. Есть ли обходной путь для этого? Большое вам спасибо за ваше внимание и внимание. –

+0

Возможно, если бы я мог запускать этот скрипт каждый раз, когда открывается электронная таблица, было бы лучше. Я попытался заменить onEdit на onOpen, но он, похоже, не работает. В любом случае это было бы хорошей идеей, так как каждый раз, когда открывается электронная таблица, скрипт запускается и приносит обновленный результат на листе таргетинга. Любые комментарии к этому приветствуются. Кстати, я отвечаю в соответствующей области? –

Смежные вопросы