#google-apps-script #google-sheets
#google-apps-script #google-таблицы #google-sheets
Вопрос:
Медленно пробиваюсь к пониманию JavaScript и таких вариаций, как GAS, но полный новичок.
У меня есть скрипт, который при выполнении копирует формулу в виде значений и вставляет ее в другую ячейку. Своего рода функция архивирования.
function csArchive() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var origin = ss.getRange('sheet1!D17');
origin.copyTo(ss.getRange('sheet1!Z2'), {contentsOnly: true});
Другими словами, скрипт выполняет:
1. скопируйте с активного листа и указанного диапазона.
2. Вставьте в указанный диапазон (z2).
чего здесь не хватает — проверьте, пусто ли значение z2, и если это не так, спускайтесь вниз, пока не найдете пустую ячейку, затем вставьте значение.
Я верю, что мое спасение — с .getLastRow()
, но, хоть убей, я не могу заставить это работать должным образом. Заранее благодарю вас!
Комментарии:
1. Следующая пустая ячейка где?
Ответ №1:
Последняя строка в столбце Z в ActiveSheet
function getColumnHeight(col,sh,ss){
var ss=ss || SpreadsheetApp.getActive();
var sh=sh || ss.getActiveSheet();
//var col=col || sh.getActiveCell().getColumn();
var col = col || 26;
var rg=sh.getRange(1,col,sh.getLastRow(),1);
var vA=rg.getValues();
while(vA[vA.length-1][0].length==0){
vA.splice(vA.length-1,1);
}
return vA.length;
}
Пример того, как использовать это:
function csArchive() {
var ss = SpreadsheetApp.getActive();
var sh = ss.getActiveSheet();
var origin = sh.getRange('sheet1!D17');
origin.copyTo(sh.getRange(getColumnHeight(26) 1,26), {contentsOnly: true});
//origin.copyTo(sh.getRange(getColumnHeight() 1,26), {contentsOnly: true});//You can also do it this way since I defaulted col parameter to 26
}
Вы хотите сказать, что у вас есть что-то вроде этого:
Предполагая, что вы не позволите этому диапазону заполняться:
function getNextEmptyCell(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet1');
var rg=sh.getRange(1,26,54,1);
var vA=rg.getValues();
while(vA[vA.length-1][0].length==0){
vA.splice(vA.length-1,1);
}
return vA.length 1;
}
function csArchive() {
var ss = SpreadsheetApp.getActive();
var sh = ss.getActiveSheet();
var origin = sh.getRange('sheet1!D17');
origin.copyTo(sh.getRange(getNextEmptyCell(),26), {contentsOnly: true});
}
Комментарии:
1. Это работает. Небольшое предостережение — я хотел использовать следующую доступную (пустую) ячейку, так как у меня есть функция суммирования после 55 ячеек. У меня есть 3 варианта: 1. переместить формулу суммы вверху. 2. Переместите формулу в другое место. 3. Измените код. Если у вас есть предложения по # 3, я весь внимание. В любом случае спасибо вам за вашу помощь!
2. Обратитесь к моему ответу с изображением и, пожалуйста, ответьте на вопрос.
3. Извините. Я несколько раз менял изображение.
4. Если это так, я бы переместил его наверх или, по крайней мере, куда-нибудь за пределы этого столбца. Это можно было бы сделать, но вам придется сказать мне, где находится дополнительный материал и что делать, если все это заполнится. Поэтому для простоты я бы просто переместил его.
5. Да, ваше изображение точное. У Z1 есть заголовок, Z2-55 пустые и для использования скриптом, у z56 есть формула. Ваш код игнорирует любые пустые ячейки между say… z5 и z56 и записывает под формулой суммы — (z57 для меня, z18 на вашем изображении).