скопировать значение с активного листа на другой лист - PullRequest
0 голосов
/ 05 марта 2020

Я хотел бы скопировать другое значение текущего листа (лист, который я вижу в момент запуска сценария) на другой лист.

function printIng() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var actualSheetName = ss.getActiveSheet().getName();
  var actualSheetName1 = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
  var selection = SpreadsheetApp.getSelection();
  var currentCell = selection.getCurrentCell();
  //Logger.log('Nome foglio'+nameRicetta);
  //var value = ss.getActiveSheet().getSheetName();
  //Logger.log('nome ricetta:'+ value);
  //var lastRow = getLastRowSpecial(dataRange);

  //TEST
  if(actualSheetName != "Indice Ricette" &&
     actualSheetName != "Template" &&
     actualSheetName != "Ingrediente" &&
     actualSheetName != "Impostazioni" &&
     actualSheetName != "Tipologia"){

       var nameRicetta = ss.getActiveSheet().getRange('C4').getValue();
         //inserire if per decidere se creare ingrediente o no
         var ui = SpreadsheetApp.getUi();
         var result = ui.alert(
           'Please confirm',
           'Are you sure you want create'+ '['+ nameRicetta +'] ingredient?',
           ui.ButtonSet.YES_NO);

         // Process the user's response.
         if (response == ui.Button.YES) {
           Logger.log('The user clicked "Yes."');
           var sheet = ss.setActiveSheet(ss.getSheetByName("Ingredienti"));
           var dataRange = sheet.getDataRange();
           //Select the column we will check for the first blank cell
           var columnToCheck = sheet.getRange("A:A").getValues();
            // Get the last row based on the data range of a single column.
           var lastRow = getLastRowSpecial(columnToCheck)+1;

           sheet.getRange(lastRow,1,1,1).setFormula('='+ nameRicetta +'\!Y2');//nome
           sheet.getRange(lastRow,2,1,1).setFormula('='+ nameRicetta +'\!Y2');//nome
           sheet.getRange(lastRow,3,1,1).setFormula('='+ nameRicetta +'\!Y2');//nome

           sheet.getRange(lastRow,4,1,1).setFormula('='+ nameRicetta +'!Y2');//zucc
           sheet.getRange(lastRow,5,1,1).setFormula('='+ nameRicetta +'!Y5');//gras
           sheet.getRange(lastRow,6,1,1).setFormula('='+ nameRicetta +'!Y8');//sml
           sheet.getRange(lastRow,7,1,1).setFormula('='+ nameRicetta +'!Y11');//as
           sheet.getRange(lastRow,8,1,1).setValue('0');
           sheet.getRange(lastRow,9,1,1).setValue('0');
           sheet.getRange(lastRow,10,1,1).setFormula('='+ nameRicetta +'!S25');//pod rel
           sheet.getRange(lastRow,11,1,1).setFormula('='+ nameRicetta +'!Q25');//pac rel
         } else {
           Logger.log('The user clicked "No" or the close button in the dialog\'s title bar.');
         }
       }
}

, но переменная actualSheetName вернуть всегда первый лист (в данном случае это «Indice Ricette»)

как получить реальный текущий лист?

РЕДАКТИРОВАТЬ enter image description here

1 Ответ

1 голос
/ 06 марта 2020

Давайте попробуем более простой пример:

function onEdit(e) {
  e.source.toast(e.range.getSheet().getName());
}

function abc() {  
  /do nothing
}

Скопируйте вышеупомянутые функции в ваш редактор скриптов и сохраните их. Затем запустите ab c (), и если вам нужно авторизовать какие-либо скрипты, появится диалоговое окно, позволяющее вам сделать это.

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

Копирование между листами в одной электронной таблице

Вот пример, который я Я сделал несколько лет go, и я считаю, что это заняло у меня около 4 часов, и я просто сделал это за 30 минут. Это полный пример с настраиваемым диалоговым окном, дающим вам возможность выбирать листы, исходный диапазон и целевой диапазон, а также копировать из исходного в конечный пункт. Удачи с этим.

ах3. html:

<!DOCTYPE html>
  <html>
    <head>
    <base target="_top">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <style>
      input{margin:5px 2px 5px 0};
    </style>
    </head>
    <body>
      <br /><select id="sel1" onchange="gotoSheet();"></select>
      <br /><input type="text" id="from" placeholder="Select Source Range" />
      <br /><input type="button" value="Save Source Range" onClick="saveFrom();"/>
      <br /><input type="text" id="to" placeholder="Selection Destination Range" />
      <br /><input type="button" value="Save Destination Range" onClick="saveTo(); "/>
      <br /><input type="button" value="Copy" onClick="doit()";/>
      <script>
        var gfrom={};
        var gto={};
        $(function(){
          google.script.run
          .withSuccessHandler(function(vA){
            updateSelect(vA);
          })
          .getSelections()
        });
         function updateSelect(vA,id){
           var id=id || 'sel1';
           vA.unshift('Please Select Sheet')
           var select = document.getElementById(id);
           select.options.length = 0; 
           for(var i=0;i<vA.length;i++) {
             select.options[i] = new Option(vA[i],vA[i]);
           }
        }
        function saveFrom() {
          google.script.run
          .withSuccessHandler(function(fObj){
            $('#from').val(fObj.fromrange);
            gfrom=fObj;           
          })
          .saveFrom();
        }
        function saveTo() {
          google.script.run
          .withSuccessHandler(function(tObj){
            $('#to').val(tObj.torange);
            gto=tObj;           
          })
          .saveTo();
        }
        function doit() {
          var cObj={};
          cObj['fromrg']=gfrom.fromrange;
          cObj['fromsh']=gfrom.fromsheet;
          cObj['torg']=gto.torange;
          cObj['tosh']=gto.tosheet;
          google.script.run.doIt(cObj);
        }
        function gotoSheet() {
          google.script.run.gotoSheet($('#sel1').val());
        }
        console.log('My Code');
      </script>
    </body>
  </html>

Code.gs:

function saveFrom() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=ss.getActiveRange();
  return {fromsheet:sh.getName(),fromrange:rg.getA1Notation()};
}

function saveTo() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=ss.getActiveRange();
  return {tosheet:sh.getName(),torange:rg.getA1Notation()};
}

function doIt(obj) {
  var ss=SpreadsheetApp.getActive();
  var fsh=ss.getSheetByName(obj.fromsh);
  var frg=fsh.getRange(obj.fromrg);
  var tsh=ss.getSheetByName(obj.tosh);
  var trg=tsh.getRange(obj.torg);
  frg.copyTo(trg);
}

function getSelections() {
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  var sA=shts.map(function(s){return s.getName();});
  return sA;
}

function gotoSheet(name) {
  var ss=SpreadsheetApp.getActive();
  ss.getSheetByName(name).activate();
}

function copyRanges() {
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutputFromFile('ah3'), "Copy From One Range to Another")
}

Запуск copyRanges запускает все это.

Анимация:

enter image description here

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

function printIng() {
  var ss=SpreadsheetApp.getActive();
  var ash=ss.getActiveSheet();
  var ashname=ash.getName();
  var currentCell=ash.getActiveCell();
  if(ashname != "Indice Ricette" && ashname != "Template" && ashname != "Ingrediente" && ashname != "Impostazioni" && ashname != "Tipologia"){

Я не понимаю цели вышеупомянутого условия, но ясно, что если case bianca или какое-либо другое имя листа, кроме имен в состоянии if, является активным листом, то вы никогда не попадете сюда

    //The only sh that makes it to here is Base Bianca
    var nameRicetta=ss.getActiveSheet().getRange('C4').getValue();//so this makes no sense
    var ui=SpreadsheetApp.getUi();
    var result=ui.alert('Please confirm','Are you sure you want create'+ '['+ nameRicetta +'] ingredient?',ui.ButtonSet.YES_NO);
    if (response == ui.Button.YES) {
      var sh=ss.getSheetByName("Ingredienti");
      var dataRange=sh.getDataRange();
      var columnToCheck=sh.getRange(1,1,sh.getLastRow(),1).getValues();
      var lastRow=sh.getLastRow()+1;
      sh.getRange(lastRow,1,1,1).setFormula('='+ nameRicetta +'\!Y2');
      sh.getRange(lastRow,2,1,1).setFormula('='+ nameRicetta +'\!Y2');
      sh.getRange(lastRow,3,1,1).setFormula('='+ nameRicetta +'\!Y2');
      sh.getRange(lastRow,4,1,1).setFormula('='+ nameRicetta +'!Y2');
      sh.getRange(lastRow,5,1,1).setFormula('='+ nameRicetta +'!Y5');
      sh.getRange(lastRow,6,1,1).setFormula('='+ nameRicetta +'!Y8');
      sh.getRange(lastRow,7,1,1).setFormula('='+ nameRicetta +'!Y11')
      sh.getRange(lastRow,8,1,1).setValue('0');
      sh.getRange(lastRow,9,1,1).setValue('0');
      sh.getRange(lastRow,10,1,1).setFormula('='+ nameRicetta +'!S25');
      sh.getRange(lastRow,11,1,1).setFormula('='+ nameRicetta +'!Q25');
    } 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...