6

Google Scriptを読みました:あるスプレッドシートから別のスプレッドシートに条件付きで行をコピーしましたが、うまく機能しませんでした。

以下の引用テキストを実行できるスクリプトが必要です。スプレッドシートを自由に編集して、完全に機能するスクリプトを作成してください。スプレッドシートは、誰でも自分で使用できるようにスクリプトをコピーできるように公開しておきます。私はスクリプトの書き方について何も知らないので、すべてを詳しく説明する必要があります。申し訳ありませんが、私はこれらすべての初心者ですが、これは私が学ぶのに役立ちます。

https://docs.google.com/spreadsheet/ccc?key=0AoJdwy8V1ldHdFA5M1M1Wlp1NHZhcmxJOUZKVEU4X3c&usp=sharing

シート「All_Mileage」の列Bに「John」と表示されている場合は、その行をコピーして、3行目以降のシート「John」に貼り付けます。

シート「All_Mileage」の列Bに「Adam」と表示されている場合は、その行をコピーして、3行目以降のシート「Adam」に貼り付けます。

シート「All_Mileage」の列Bに「Mike」と表示されている場合は、その行をコピーして、3行目以降のシート「Mike」に貼り付けます。

ここで他のスクリプトを見ましたが、動作させることができませんでした。私が言ったように、コードに関しては苗木よりも環境に優しいです。

トンありがとう!

4

1 に答える 1

12

C.Langは正しいです、これは既製のスクリプトを入手する場所ではありません...しかし、この質問は非常に一般的であり、頻繁に質問されているため、作成してテストするのに数分かかりました...

var ss=SpreadsheetApp.getActiveSpreadsheet();// some global variables
var master = ss.getSheetByName('All_Mileage');
var colWidth = master.getMaxColumns();


    function copyRowsOnCondition() {
      var data = master.getDataRange().getValues();
      for(n=2;n<data.length;++n){
        if(data[n][1].length<16){ // if not pre-filled with your text
        Logger.log(data[n][1])
         var dest = ss.getSheetByName(data[n][1].toString().replace(/ /g,''));//remove any spaces that could be included in the name so the name = sheetName for sure
         var destRange = dest.getRange(dest.getLastRow()+1,1);// the place to write
         master.getRange(n+1,1,1,colWidth).copyTo(destRange);the copy itself value & format
         }
      }// loop
    }

編集: MasterSheetの名前の値を使用して宛先シートを検索したので、同じルールを使用して宛先シートを作成することにより、宛先シートが存在しない場合を処理することが役立つと思いました。name = sheetName..。

もう1つの問題は、どの行がすでにコピーされているかを知る方法がないことでした...そこで、手動で選択された行のみをコピーし(単一の列のみでも)、背景を変更して、すべてを処理するバージョンを作成しましたこれらの行が処理されたことを示す色。最小限の快適さのためのメニューも追加しました;-)

(寒い日曜日の午後に忙しくする方法;-)

var ss=SpreadsheetApp.getActiveSpreadsheet();
var master = ss.getSheetByName('All_Mileage');
var colWidth = master.getLastColumn();// last used col in masterSheet
var sheets = ss.getSheets();// number of sheets

function onOpen() {
  var menuEntries = [ {name: "Copy selected Rows to sheets", functionName: "copyRowsOnConditionV2"},

                     ];
  ss.addMenu("Copy functions",menuEntries);// custom menu
}
function copyRowsOnConditionV2() {
  var sheetNames = [];// array of existing sheet names
  var sheets = ss.getSheets();// number of sheets
  for(s=0;s<sheets.length;++s){sheetNames.push(sheets[s].getName())};
  ss.getActiveSelection().setBackground('#ffffbb'); 
  var selectedfirstRow = ss.getActiveSelection().getRowIndex();
  var selectedHeigth = ss.getActiveSelection().getHeight()
  var selectedFullRange = master.getRange(selectedfirstRow,1,selectedHeigth,colWidth);
  var data = selectedFullRange.getValues();
  for(n=0;n<data.length;++n){
    if(data[n][1].length<16){
     if(sheetNames.toString().match(data[n][1].toString().replace(/ /g,''))!=data[n][1].toString().replace(/ /g,'')){// if no sheet exist with this name
     var newSheet = ss.insertSheet(data[n][1].toString().replace(/ /g,''),ss.getSheets().length);// then create it
     master.getRange(1,1,2,colWidth).copyTo(newSheet.getRange(1,1));// and copy the headers on 2 first rows, then continue as usual
     newSheet.getRange(1,1).setValue('Gas Mileage Log - '+data[n][1].toString().replace(/ /g,''));// set name in header
     SpreadsheetApp.flush();
     var sheets = ss.getSheets();// number of sheets
     var sheetNames = [];// update array of existing sheet names
     for(s=1;s<sheets.length;++s){sheetNames.push(sheets[s].getName())};
     Logger.log(sheetNames)
     };
     var dest = ss.getSheetByName(data[n][1].toString().replace(/ /g,''));//find the destination sheet
     Logger.log(data[n][1].toString().replace(/ /g,''))
     var destRange = dest.getRange(dest.getLastRow()+1,1);// define range
     master.getRange(selectedfirstRow+n,1,1,colWidth).copyTo(destRange);// and make copy below last row
     }
  }
}

下の図:

ここに画像の説明を入力してください

于 2013-02-02T20:28:17.520 に答える