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

Вход

Регистрация

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

 

= Мир MS Excel/Сохранение ячейки в ДРУГОМ файле google таблиц. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Сохранение ячейки в ДРУГОМ файле google таблиц.
abra-kadabra Дата: Понедельник, 01.05.2017, 21:54 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Здравствуйте! Уважаемые, есть у меня проблемка. Заключается она в следующем: нужно в Google таблицах сделать так, что если в 8 столбце появляется слово "да", то вся эта строчка переходит в другой файл.
Нарыл я следующее:
1)Всё тоже самое, что и у меня можно реализовать через function onedit
2)IMPORTRANGE не подходит, т.к. это именно ссылка, а мне нужны значения, да и ссылок этих будет много.
3)Нужно быть аккуратнее с такими вещами как выделение и последующее копирование, так как таблица используется несколькими людьми сразу.
А теперь вопросы:
1)Как переделать мой код написанный в VBA(он в файле) под google script(а может даже и без него можно обойтись, хотя я очень сомневаюсь)
2)Как я понял тут нужно разрешение на доступ к изменениям в файле. Это разрешение должен давать каждый из пользователей файлами или достаточно, чтобы владелец файла разрешил один раз и всё?
И вот файлы в google:
Файл №2
Файл №1
Всем огромное спасибо. Я понимаю, что тут, возможно, не так много людей понимающих в google scripts.(может тогда есть дельный форум по этой теме?)
В любом случае всем спасибо за Ваше внимание. А если уж поучаствуете, то hands hands hands ^_^
К сообщению приложен файл: 7634069.xlsx (8.3 Kb) · 7316149.xlsm (16.9 Kb)
 
Ответить
СообщениеЗдравствуйте! Уважаемые, есть у меня проблемка. Заключается она в следующем: нужно в Google таблицах сделать так, что если в 8 столбце появляется слово "да", то вся эта строчка переходит в другой файл.
Нарыл я следующее:
1)Всё тоже самое, что и у меня можно реализовать через function onedit
2)IMPORTRANGE не подходит, т.к. это именно ссылка, а мне нужны значения, да и ссылок этих будет много.
3)Нужно быть аккуратнее с такими вещами как выделение и последующее копирование, так как таблица используется несколькими людьми сразу.
А теперь вопросы:
1)Как переделать мой код написанный в VBA(он в файле) под google script(а может даже и без него можно обойтись, хотя я очень сомневаюсь)
2)Как я понял тут нужно разрешение на доступ к изменениям в файле. Это разрешение должен давать каждый из пользователей файлами или достаточно, чтобы владелец файла разрешил один раз и всё?
И вот файлы в google:
Файл №2
Файл №1
Всем огромное спасибо. Я понимаю, что тут, возможно, не так много людей понимающих в google scripts.(может тогда есть дельный форум по этой теме?)
В любом случае всем спасибо за Ваше внимание. А если уж поучаствуете, то hands hands hands ^_^

Автор - abra-kadabra
Дата добавления - 01.05.2017 в 21:54
doober Дата: Среда, 03.05.2017, 10:01 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 983
Репутация: 340 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте.
Запросил доступ на редактирование.Возможно смогу помочь


 
Ответить
СообщениеЗдравствуйте.
Запросил доступ на редактирование.Возможно смогу помочь

Автор - doober
Дата добавления - 03.05.2017 в 10:01
abra-kadabra Дата: Среда, 03.05.2017, 17:46 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
[vba]
Код

function onEdit(e)
{
if (e.range.getColumn() == 8 && e.range.getValue() == "да")
  {
    var id_otherss = "1fWO0k_wS1-dQ-OFykPUOS833s5E3VgPQW1qyinJn5z4"; //файл куда копируем
    var otherss = SpreadsheetApp.openById(id_otherss); //открываем другой файл
    var othersheet = otherss.getSheetByName("ура"); //название листа в другом файле
    var k = 0; //на сколько смещать вниз
    var occupied = 0; //если занято
    
    var stolb1 = e.range.offset(0,-7).getValue();
    var stolb2 = e.range.offset(0,-6).getValue();
    var stolb3 = e.range.offset(0,-3).getValue();
  
    for (var i=1; i<=3 ; i++)
    {
      if (othersheet.getRange((1+k+occupied), i).getValue() !== "") //если занято
        {
          occupied++;
          i=1;
          
        };
    };

     othersheet.getRange((1+k+occupied), 1).setValue(stolb1);
     othersheet.getRange((1+k+occupied), 2).setValue(stolb2).setNumberFormat("dd-mm-yyyy");
     othersheet.getRange((1+k+occupied), 3).setValue(stolb3);
    
   Browser.msgBox("Ага", Browser.Buttons.OK_CANCEL);
  };
}
[/vba]
Вот, что у меня получилось спустя несколько дней(язык зверски похож на C++, так что особых сложностей не возникло) файл Файл №3
Вопросы:
1)Какие нужны разрешения?Теперь конкретно:
а)Если у меня есть доступ к файлу(редактирование)(я не владелец), то могу ли я просто вставить скрипт и радоваться?
б)Достаточно ли один раз дать разрешение или каждый из пользователей должен соглашаться?
2)В конце мне нужно открыть получившийся файл и выбрать ячейку последнюю. Как это сделать(openbyid работает не так)
 
Ответить
Сообщение[vba]
Код

function onEdit(e)
{
if (e.range.getColumn() == 8 && e.range.getValue() == "да")
  {
    var id_otherss = "1fWO0k_wS1-dQ-OFykPUOS833s5E3VgPQW1qyinJn5z4"; //файл куда копируем
    var otherss = SpreadsheetApp.openById(id_otherss); //открываем другой файл
    var othersheet = otherss.getSheetByName("ура"); //название листа в другом файле
    var k = 0; //на сколько смещать вниз
    var occupied = 0; //если занято
    
    var stolb1 = e.range.offset(0,-7).getValue();
    var stolb2 = e.range.offset(0,-6).getValue();
    var stolb3 = e.range.offset(0,-3).getValue();
  
    for (var i=1; i<=3 ; i++)
    {
      if (othersheet.getRange((1+k+occupied), i).getValue() !== "") //если занято
        {
          occupied++;
          i=1;
          
        };
    };

     othersheet.getRange((1+k+occupied), 1).setValue(stolb1);
     othersheet.getRange((1+k+occupied), 2).setValue(stolb2).setNumberFormat("dd-mm-yyyy");
     othersheet.getRange((1+k+occupied), 3).setValue(stolb3);
    
   Browser.msgBox("Ага", Browser.Buttons.OK_CANCEL);
  };
}
[/vba]
Вот, что у меня получилось спустя несколько дней(язык зверски похож на C++, так что особых сложностей не возникло) файл Файл №3
Вопросы:
1)Какие нужны разрешения?Теперь конкретно:
а)Если у меня есть доступ к файлу(редактирование)(я не владелец), то могу ли я просто вставить скрипт и радоваться?
б)Достаточно ли один раз дать разрешение или каждый из пользователей должен соглашаться?
2)В конце мне нужно открыть получившийся файл и выбрать ячейку последнюю. Как это сделать(openbyid работает не так)

Автор - abra-kadabra
Дата добавления - 03.05.2017 в 17:46
abra-kadabra Дата: Среда, 03.05.2017, 17:52 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Ваш пример(я специально копирую на форум, чтобы код всегда был тут на случай если с файлами что-то случится):
[vba]
Код
   var Idsheet = '1fWO0k_wS1-dQ-OFykPUOS833s5E3VgPQW1qyinJn5z4'//Ид книги вставки данных
     var SName = 'Лист1'; //  Имя листа  для отслеживания изменений
     var Column = 8; //Номер столбца
     function onEdits(e) {
         var range = e.range;
         if (range.getColumn() != Column) { return; }
         var dt = range.getValue();
         if (dt != 'да') { return; }
         var sheet = SpreadsheetApp.getActiveSheet();
         var SheetName = sheet.getSheetName();
         if (SheetName != SName) { return; };
         var sh = SpreadsheetApp.openById(Idsheet);
         var LastRow = get_LastRow(sh.getRange("A:A")) + 1;

         var A = range.offset(0, 1 - Column).getValue();
         var B = new Date(range.offset(0, 2 - Column).getValue());
         var E = range.offset(0, 5 - Column).getValue();
         sh.getRange("A" + LastRow).setValue(A);
         sh.getRange("B" + LastRow).setValue(B);
         sh.getRange("C" + LastRow).setValue(E);

     }

     function get_LastRow(range) {

         var RowIndex = 0;
         var values = range.getValues();

         for (var r = 0; r < values.length; r++) {

             if (values[r][0].toString() != '') {
                 RowIndex += 1;
             } else {
                 break;
             }

         }

         return RowIndex;

     }
[/vba]
1)СПАСИБО!
2) Ваш код не правильно год переносит
3) Я не очень понял начиная с "var LastRow = get_LastRow(sh.getRange("A:A")) + 1;"
а) Зачем брать целый столбец и добавлять один?
б)Да и дальше где к столбцам прибавляется последняя строчка... тоже не очень
Добавьте пожалуйста комментариев.
 
Ответить
СообщениеВаш пример(я специально копирую на форум, чтобы код всегда был тут на случай если с файлами что-то случится):
[vba]
Код
   var Idsheet = '1fWO0k_wS1-dQ-OFykPUOS833s5E3VgPQW1qyinJn5z4'//Ид книги вставки данных
     var SName = 'Лист1'; //  Имя листа  для отслеживания изменений
     var Column = 8; //Номер столбца
     function onEdits(e) {
         var range = e.range;
         if (range.getColumn() != Column) { return; }
         var dt = range.getValue();
         if (dt != 'да') { return; }
         var sheet = SpreadsheetApp.getActiveSheet();
         var SheetName = sheet.getSheetName();
         if (SheetName != SName) { return; };
         var sh = SpreadsheetApp.openById(Idsheet);
         var LastRow = get_LastRow(sh.getRange("A:A")) + 1;

         var A = range.offset(0, 1 - Column).getValue();
         var B = new Date(range.offset(0, 2 - Column).getValue());
         var E = range.offset(0, 5 - Column).getValue();
         sh.getRange("A" + LastRow).setValue(A);
         sh.getRange("B" + LastRow).setValue(B);
         sh.getRange("C" + LastRow).setValue(E);

     }

     function get_LastRow(range) {

         var RowIndex = 0;
         var values = range.getValues();

         for (var r = 0; r < values.length; r++) {

             if (values[r][0].toString() != '') {
                 RowIndex += 1;
             } else {
                 break;
             }

         }

         return RowIndex;

     }
[/vba]
1)СПАСИБО!
2) Ваш код не правильно год переносит
3) Я не очень понял начиная с "var LastRow = get_LastRow(sh.getRange("A:A")) + 1;"
а) Зачем брать целый столбец и добавлять один?
б)Да и дальше где к столбцам прибавляется последняя строчка... тоже не очень
Добавьте пожалуйста комментариев.

Автор - abra-kadabra
Дата добавления - 03.05.2017 в 17:52
abra-kadabra Дата: Среда, 03.05.2017, 17:57 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
И ещё одна вещь как здесь можно заменить следующее(долго мучился и при этом получилось как-то,но потом опять куда-то делось :D )
[vba]
Код
for (var j=1; j<=3; j++)
{
  othersheet.getRange((1+k+occupied), j).setValue!!!!(stolb && j);!!!!
};
[/vba]
Не работает и всё тут. :p


Сообщение отредактировал abra-kadabra - Среда, 03.05.2017, 18:05
 
Ответить
СообщениеИ ещё одна вещь как здесь можно заменить следующее(долго мучился и при этом получилось как-то,но потом опять куда-то делось :D )
[vba]
Код
for (var j=1; j<=3; j++)
{
  othersheet.getRange((1+k+occupied), j).setValue!!!!(stolb && j);!!!!
};
[/vba]
Не работает и всё тут. :p

Автор - abra-kadabra
Дата добавления - 03.05.2017 в 17:57
Gustav Дата: Среда, 03.05.2017, 21:45 | Сообщение № 6
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Коллеги, смотрю ищете позицию для вставки записи в конец таблицы. На всякий случай информирую, что у листа есть на этот случай специальный метод appendRow:
[vba]
Код
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

// Appends a new row with 3 columns to the bottom of the
// spreadsheet containing the values in the array
sheet.appendRow(["a man", "a plan", "panama"]);
[/vba]
Код вставит три текстовых значения в последнюю (новую) строку листа в колонки A:C.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеКоллеги, смотрю ищете позицию для вставки записи в конец таблицы. На всякий случай информирую, что у листа есть на этот случай специальный метод appendRow:
[vba]
Код
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

// Appends a new row with 3 columns to the bottom of the
// spreadsheet containing the values in the array
sheet.appendRow(["a man", "a plan", "panama"]);
[/vba]
Код вставит три текстовых значения в последнюю (новую) строку листа в колонки A:C.

Автор - Gustav
Дата добавления - 03.05.2017 в 21:45
doober Дата: Четверг, 04.05.2017, 03:14 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 983
Репутация: 340 ±
Замечаний: 0% ±

Excel 2010
Благодарю Gustav, не знал о appendRow.
Ваш код не правильно год переносит

Замените строку
[vba]
Код
var B = [b]new Date[/b](range.offset(0, 2 - Column).getValue());
[/vba]
на строку и прописывайте формат данных столбца
[vba]
Код
var B =range.offset(0, 2 - Column).getValue();
[/vba]


 
Ответить
СообщениеБлагодарю Gustav, не знал о appendRow.
Ваш код не правильно год переносит

Замените строку
[vba]
Код
var B = [b]new Date[/b](range.offset(0, 2 - Column).getValue());
[/vba]
на строку и прописывайте формат данных столбца
[vba]
Код
var B =range.offset(0, 2 - Column).getValue();
[/vba]

Автор - doober
Дата добавления - 04.05.2017 в 03:14
abra-kadabra Дата: Вторник, 09.05.2017, 04:30 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
doober Спасибо за код. Многое вспомнил.

Gustav а не подскажете можно ли ваше ваше дельное предложение реализовать вот так:
[vba]
Код
othersheet.appendRow([stolb1, stolb2.setNumberFormat("dd-mm-yyyy"), stolb3]);
[/vba]
или только так
[vba]
Код
var last = othersheet.getLastRow();
othersheet.getRange(last, 2).setValue(stolb2).setNumberFormat("dd-mm-yyyy")
[/vba]


Сообщение отредактировал abra-kadabra - Вторник, 09.05.2017, 04:49
 
Ответить
Сообщениеdoober Спасибо за код. Многое вспомнил.

Gustav а не подскажете можно ли ваше ваше дельное предложение реализовать вот так:
[vba]
Код
othersheet.appendRow([stolb1, stolb2.setNumberFormat("dd-mm-yyyy"), stolb3]);
[/vba]
или только так
[vba]
Код
var last = othersheet.getLastRow();
othersheet.getRange(last, 2).setValue(stolb2).setNumberFormat("dd-mm-yyyy")
[/vba]

Автор - abra-kadabra
Дата добавления - 09.05.2017 в 04:30
Gustav Дата: Вторник, 09.05.2017, 18:44 | Сообщение № 9
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Я бы реализовал так. Сначала отдельно выполнил бы один раз форматирование столбца B:
[vba]
Код
othersheet.getRange("B:B").setNumberFormat("dd-mm-yyyy");
[/vba]
а потом бы уже просто использовал stolb2 без каких-либо "добавок":
[vba]
Код
othersheet.appendRow([stolb1, stolb2, stolb3]);
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеЯ бы реализовал так. Сначала отдельно выполнил бы один раз форматирование столбца B:
[vba]
Код
othersheet.getRange("B:B").setNumberFormat("dd-mm-yyyy");
[/vba]
а потом бы уже просто использовал stolb2 без каких-либо "добавок":
[vba]
Код
othersheet.appendRow([stolb1, stolb2, stolb3]);
[/vba]

Автор - Gustav
Дата добавления - 09.05.2017 в 18:44
abra-kadabra Дата: Среда, 10.05.2017, 03:10 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Да, как ни странно(я думал грузиться долго будет) сработало. В итоге вот, что вышло(двумерный массив очень уж грузил, поэтому я отказался от варианта doober):
[vba]
Код
function onEdit(e)
{
if (e.range.getColumn() == 8 && e.range.getValue() == "да")
  {
    var id_otherss = "1fWO0k_wS1-dQ-OFykPUOS833s5E3VgPQW1qyinJn5z4"; //файл куда копируем
    var name_sheet = "ура";     //название листа
    var date_col = "B";
    var otherss = SpreadsheetApp.openById(id_otherss); //открываем другой файл
    var othersheet = otherss.getSheetByName(name_sheet); //название листа в другом файле
    var k = 0; //на сколько смещать вниз
    var occupied = 0; //если занято

    var stolb1 = e.range.offset(0,-7).getValue();
    var stolb2 = e.range.offset(0,-6).getValue();
    var stolb3 = e.range.offset(0,-3).getValue();

    othersheet.appendRow([stolb1, stolb2, stolb3]);
    othersheet.getRange(date_col + ":" + date_col).setNumberFormat("dd-mm-yyyy"); //весь столбец к одному формату
    
    openNewWindow(id_otherss);
    
  };
}

function openNewWindow(id)
{
  var htmlString =
    '<div>' +
      '<input type="button" value="Close" onclick="google.script.host.close()" />' + //создаём кнопку на всякий
    '</div>' +
    '<script>'+
      'window.open("https://docs.google.com/spreadsheets/d/'+ id +'");'+ //переходим на нужную страницу
      'google.script.host.close();'+  //закрываемся
    '</script>';

  var htmlOutput = HtmlService
    .createHtmlOutput(htmlString)
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .setHeight(60);

  SpreadsheetApp
    .getUi()
    .showModalDialog(htmlOutput, 'Щас всё будет...');

}
[/vba]
Всем Огромное СПАСИБО за помощь
Единственное что, т.к. это мой дебют в js, то может кто какие замечания сделает?


Сообщение отредактировал abra-kadabra - Среда, 10.05.2017, 03:15
 
Ответить
СообщениеДа, как ни странно(я думал грузиться долго будет) сработало. В итоге вот, что вышло(двумерный массив очень уж грузил, поэтому я отказался от варианта doober):
[vba]
Код
function onEdit(e)
{
if (e.range.getColumn() == 8 && e.range.getValue() == "да")
  {
    var id_otherss = "1fWO0k_wS1-dQ-OFykPUOS833s5E3VgPQW1qyinJn5z4"; //файл куда копируем
    var name_sheet = "ура";     //название листа
    var date_col = "B";
    var otherss = SpreadsheetApp.openById(id_otherss); //открываем другой файл
    var othersheet = otherss.getSheetByName(name_sheet); //название листа в другом файле
    var k = 0; //на сколько смещать вниз
    var occupied = 0; //если занято

    var stolb1 = e.range.offset(0,-7).getValue();
    var stolb2 = e.range.offset(0,-6).getValue();
    var stolb3 = e.range.offset(0,-3).getValue();

    othersheet.appendRow([stolb1, stolb2, stolb3]);
    othersheet.getRange(date_col + ":" + date_col).setNumberFormat("dd-mm-yyyy"); //весь столбец к одному формату
    
    openNewWindow(id_otherss);
    
  };
}

function openNewWindow(id)
{
  var htmlString =
    '<div>' +
      '<input type="button" value="Close" onclick="google.script.host.close()" />' + //создаём кнопку на всякий
    '</div>' +
    '<script>'+
      'window.open("https://docs.google.com/spreadsheets/d/'+ id +'");'+ //переходим на нужную страницу
      'google.script.host.close();'+  //закрываемся
    '</script>';

  var htmlOutput = HtmlService
    .createHtmlOutput(htmlString)
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .setHeight(60);

  SpreadsheetApp
    .getUi()
    .showModalDialog(htmlOutput, 'Щас всё будет...');

}
[/vba]
Всем Огромное СПАСИБО за помощь
Единственное что, т.к. это мой дебют в js, то может кто какие замечания сделает?

Автор - abra-kadabra
Дата добавления - 10.05.2017 в 03:10
  • Страница 1 из 1
  • 1
Поиск:

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