Как автоматически вставить новую строку и сохранить функции / формулы из последней строки?

24

У меня есть таблица с ячейками, которые имеют функции / формулы, как этот:

введите описание изображения здесь

Мне нужен скрипт, который создает новую строку, копируя вместе с ней функции / формулы последней использованной строки. Я нахожу этот скрипт, который создает новую строку, но он не копирует функции / формулы . Как я могу реализовать эту задачу копирования в Google Apps Script без необходимости выбирать и копировать вручную?

Ученик Питонисты
источник
если моя предыдущая формула строки = HTTPResponse (C4), как я могу скопировать ту же формулу, но новый номер ячейки для новой строки?
user1788736

Ответы:

20

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

Код

// global 
var ss = SpreadsheetApp.getActive();

function onOpen() {
  var menu = [{name:"Add New Last Row", functionName:"addRow"}];
  ss.addMenu("Extra", menu);
}

function addRow() {
  var sh = ss.getActiveSheet(), lRow = sh.getLastRow(); 
  var lCol = sh.getLastColumn(), range = sh.getRange(lRow,1,1,lCol);
  sh.insertRowsAfter(lRow, 1);
  range.copyTo(sh.getRange(lRow+1, 1, 1, lCol), {contentsOnly:false});
}

замечание

Установка contentOnly в falseдаст стандартную копию. Если установить его true, будут вставлены только значения. Найденный вами пример сценария выполняет намного больше, чем вставка значений .....

пример

Я создал файл примера для вас: Добавить строку с формулой

Джейкоб Ян Туинстра
источник
3

Эта ArrayFormula может делать то же самое без использования скрипта. Введите его в D4, и он будет автоматически перенесен в любое количество пустых ячеек под ним.

ArrayFormula(vlookup(B4:B:tax_table!$A$2:$G$8;3;true))

Примечания: «B4: B» означает, посмотрите все ячейки, начиная с B4 и до конца столбца.

В то время как ArrayFormula заботится о копировании себя в ячейки под ним. Просто убедитесь, что клетки под ним пустые.

user3660579
источник
3

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

function addFirstRow() {
    var firstRow = 1;
    var sh = ss.getActiveSheet();
    var lCol = sh.getLastColumn();
    var range = sh.getRange(firstRow, 1, 1, lCol);
    var formulas = range.getFormulas();
    sh.insertRowsAfter(1, 1);
    newRange = sh.getRange(firstRow, 1, 1, lCol);
    newRange.setFormulas(formulas);
}
dgpro
источник
1
Привет Денис, Вы имеете в виду пост, который я создал? Я просто проверяю сценарий, и он все еще работает. С уважением, Джейкоб Ян
Джейкоб Ян Туинстра
Привет @JacobJanTuinstra, да, ты прав. На самом деле я пытался добавить новую строку сверху и сохранить формулу из той же строки, и это не сработало, потому что скрипт пытался скопировать данные из только что созданной пустой строки. Я обновлю свой ответ, чтобы отразить это. Спасибо
dgpro
Привет @DenGordo! Спасибо за это. Как бы я изменил это, если у меня есть только значения для перемещения, а не формулы? Благодарность!
Drewdavid
О PS - Где я могу указать, с какой вкладкой я имею дело? Еще раз спасибо.
Drewdavid
-2

Для решения этой проблемы я использовал setFormula(range), например:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

var cell = sheet.getRange("B5");
 cell.setFormula("=SUM(B3:B4)");

Ваша формула будет автоматически увеличиваться в соответствии с индексом строки.

Наконец, вы можете добавить триггер onUpdate или onEdit.

user70790
источник
-1; Как вызывается код? Вы добавляете сумму, но вам нужно добавить строку физически. onUpdateТриггер не существует.
Джейкоб Ян Туинстра