2017-12-18 7 views
0

セルをコピーするためのスクリプトを作成しました* OnEdit(シート2のcol16) Col16 = "はい")(今Col4)のカスタム列の最後の行に。しかし、私はというクエリベースのデータを持っているので、私のスクリプトは手で "はい"と入力したときにのみデータをコピーします。だからこそ私はこのスクリプトをボタンで実行する必要があります。あるいは、時間駆動のトリガーとして実行する必要があります。ボタンで動作させることはできません。ボタンをクリックして作業できるようにするには、次のスクリプトをどのように変更するのですか?OnEditスクリプトをRun-by-buttonスクリプトに変換する方法(ルールで1つのシートから別のシートにセルをコピーする)

function onEdit(e) { 
    var ss = SpreadsheetApp.getActive(); 
    var sheet = ss.getActiveSheet(); 
if (sheet.getName() !== '2' || e.range.getColumn() !== 16 || e.value !== 'Yes') return; 
    var value = e.range.offset(0,-12,1,1).getValue(); 
    sheet = e.source.getSheetByName('1'); 
    var grd = sheet.getRange("D:D").getValues(); 
    var maxIndex = grd.reduce(function(maxIndex, row, index) { 
    return row[0] === "" ? maxIndex : index; 
    }, 0); 
    sheet.getRange(maxIndex+2,e.range.getColumn()-12,1,1).setValue(value); 
} 

UPDATE:私は、このように私のスクリプトを変更しようとしたボタンにそれを割り当てた、それは「.....その後、完成した実行中...」と言うが、それをボタン - 上のクリックした後(ただし、OnEdit(e)のときに動作し、エラーは発生しません) しかし、 "OnEdit(e)"を "copymissings()"に変更するだけでは十分ではないようです。コードで何かが、私は正確に何を知らない助けてください:。

function copymissings() { 
    var s = SpreadsheetApp.getActive(); 
    if (s.getName() !== '2' || range.getColumn() !== 16 || value !== 'Yes') return; 
    var value = range.offset(0,-12,1,1).getValues(); 
    sht = s.getSheetByName('1'); 
    var grd = sheet.getRange("D:D").getValues(); 
    var maxIndex = grd.reduce(function(maxIndex, row, index) { 
    return row[0] === "" ? maxIndex : index; 
    }, 0); 
    sht.getRange(maxIndex+2,range.getColumn()-12,1,1).setValues(value); 
} 

が可視化: CLICK TO SEE GIF

+0

可能な重複[アプリのスクリプトを使用して、Googleスプレッドシートのセル内のUIを追加するにはどうすればよい?](https://stackoverflow.com/questions/6876819/how-do-you-add-ui-inside -cells-in-a-google-spreadsheet-using-app-script) –

+0

ボタンで実行できないということはどういう意味ですか?何を試しましたか?エラーメッセージが表示されましたか? –

+0

こんにちは、私の投稿を更新しました – Stz

答えて

0

「Plus」Google AppsスクリプトフォーラムのEdward Ulleに感謝します。

私は、OnEditを自動的に処理している投稿と同じスクリプトの作業バージョンを作成しました。

次のスクリプトは、シート2のCol4のセルを、その列にcol16からSheet1のcol4に "はい"が含まれている場合にコピーします。すべてのオプション。

function copymissings() { 
    try { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    // Source sheet 
    var shs = ss.getSheetByName("2"); 
    // Values from Sheet2 
    var vs = shs.getRange(1,1,shs.getLastRow(),shs.getLastColumn()).getValues(); 
    // Destination sheet 
    var shd = ss.getSheetByName("1"); 
    // Get the destination range 
    var rd = shd.getRange("D:D"); 
    // Gets a 2D array 
    var vd = rd.getValues(); 
    var j = 1; 
    // Get offset j to first empty row 
    for(j=0; j<vd.length; j++) { 
     if(vd[j][0] == 0) break; 
    } 
    // Assuming you want to do for every row in Sheet2 
    for(var i=0; i<vs.length; i++) { 
     if(vs[i][15] == "Yes") { // Column 16 is index 15 
     // Use offset from last row of destination sheet 
     rd.offset(j,0,1,1).setValue(vs[i][3]); // Copy to column 4 (0) 
     j++; // Increment to next row 
     } 
    } 
    } 
    catch(err) { 
    Logger.log(err); 
    } 
} 
0

ここでは、2つのコンセプトを混在させていると思います。 onEdit()は、ユーザーがセルの値を変更したときに自動的に実行されるトリガーです。しかし、あなたがしようとしているのはMANUALです。イベントがトリガーされるときにユーザーが担当しているためです。

UIボタンの作成方法については、HTML Service: Create and Serve HTMLを参照してください。実際のサンプルはhereです。

+0

私は期待していたものではありません。私自身によって答えるty – Stz

関連する問題