2017-08-02 16 views
1

JavaScriptまたはGoogle Appsのスクリプトが初めてです。私はこの機能を使用して、GoogleスプレッドシートからMySQLデータベースにデータをインポートしています。このシートには16000を超えるレコードがあり、インポートを2000レコードの小規模なバッチに分解したいと考えています。 createGASTrigger()関数では、最初の反復でスプレッドシートから最初の2000レコードを取得し、次に2番目の反復で次の2000レコードを取得するようにロジックを変更する方法はありますか。Google Appsスクリプトでトリガーを使用して機能を再実行する

機能1

var address = 'database_IP_address'; 
var rootPwd = 'root_password'; 
var user = 'user_name'; 
var userPwd = 'user_password'; 
var db = 'database_name'; 

var root = 'root'; 
var instanceUrl = 'jdbc:mysql://' + address; 
var dbUrl = instanceUrl + '/' + db; 

function myFunction() { 

    var stime = new Date(); 
    var col1; 
    var col2; 
    var col3; 

    var dbconnection = Jdbc.getConnection(dbUrl, root, rootPwd); 
    var statement = dbconnection.createStatement(); 
    var googlesheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1'); 
    var data = googlesheet.getDataRange().getValues(); 

dbconnection.setAutoCommit(false) 

for (var i = 1; i < data.length; i++) { 
col1 = data[i][0]; 
col2 = data[i][1]; 
col3 = data[i][2]; 

var sql = "{call [dbo].[sp_googlesheetimport](?,?,?)}"; 
statement = dbconnection.prepareCall(sql); 
statement.setString(1, col1); 
statement.setString(2, col2); 
statement.setString(3, col3); 
statement.addBatch(); 
} 

statement.executeBatch(); 
dbconnection.commit(); 
statement.close(); 
dbconnection.close(); 

    var etime = new Date(); 
    Logger.log('Exec time: ' + (etime.getTime() - stime.getTime())); 
} 

機能2

function createGASTrigger() { 
    var varUserPropertiesService = PropertiesService.getUserProperties(); 
    var varUserTriggerId = varUserPropertiesService.getProperty("myFunction"); 
    var varUserTrigger = ScriptApp.getProjectTriggers(); 

    for (var i in varUserTrigger) { 
     if (varUserTrigger[i].getUniqueId() == varUserTriggerId) 
     try 
     { 
      ScriptApp.deleteTrigger(varUserTrigger[i]); 
     } 
     catch(e) 
     { 
      Utilities.sleep(30000); 
      ScriptApp.deleteTrigger(varUserTrigger[i]); 
     } 
    } 

    myFunction(); 

    var userProperties = PropertiesService.getUserProperties(); 
    try 
    { 
     var nextTrigger = ScriptApp.newTrigger("myFunction").timeBased().after(1 * 120 * 1000).create(); 
    } 
    catch(e) 
    { 
     Utilities.sleep(30000); 
     var nextTrigger = ScriptApp.newTrigger("myFunction").timeBased().after(1 * 120 * 1000).create(); 
    }  
} 

答えて

2
を追加すると、すべての行のスプレッドシートに値を追加してください

私はこれをテストしていないが、これは良い出発点だと思うt。

function myFunction() { 

    var stime = new Date(); 
    var col1; 
    var col2; 
    var col3; 
    var dbconnection = Jdbc.getConnection(dbUrl, root, rootPwd); 
    var statement = dbconnection.createStatement(); 
    var googlesheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1'); 
    var data = googlesheet.getDataRange().getValues(); 
    var itrows=1000; 
    var complete=false; 
    if(PropertiesService.getScriptProperties().getProperty('iteration')) 
    { 
    var iteration=Number(PropertiesService.getScriptProperties().getProperty('iteration') + 1); 
    } 
    else 
    { 
    var iteration=Number(PropertiesService.getScriptProperties().setProperty('iteration', 1)); 
    } 

    var max=itrows * iteration; 
    var min=max - itrows + 1; 
    if(max>data.length-1) 
    { 
    max=data.length-1; 
    complete=true; 
    } 


    dbconnection.setAutoCommit(false) 

    for (var i=min;i<=max;i++) 
    { 
    col1 = data[i][0]; 
    col2 = data[i][1]; 
    col3 = data[i][2]; 
    var sql = "{call [dbo].[sp_googlesheetimport](?,?,?)}"; 
    statement = dbconnection.prepareCall(sql); 
    statement.setString(1, col1); 
    statement.setString(2, col2); 
    statement.setString(3, col3); 
    statement.addBatch(); 
    } 

    statement.executeBatch(); 
    dbconnection.commit(); 
    statement.close(); 
    dbconnection.close(); 
    if(complete) 
    { 
    PropertiesService.getScriptProperties().deleteProperty('iteration'); 
    } 
    var etime = new Date(); 
    Logger.log('Exec time: ' + (etime.getTime() - stime.getTime())); 
} 

function createGASTrigger() { 
    var varUserPropertiesService = PropertiesService.getUserProperties(); 
    var varUserTriggerId = varUserPropertiesService.getProperty("myFunction"); 
    var varUserTrigger = ScriptApp.getProjectTriggers(); 

    for (var i=0;i<varUserTrigger.length;i++) 
    { 
     if (varUserTrigger[i].getUniqueId() == varUserTriggerId) 
     { 
     ScriptApp.deleteTrigger(varUserTrigger[i]); 
     break; 
     } 
    } 
    var userProperties = PropertiesService.getUserProperties(); 
    var nextTrigger = ScriptApp.newTrigger("myFunction").timeBased().after(1 * 120 * 1000).create(); 
} 
+0

ありがとう。 – PVB

0

PropertiesService.getScriptProperties()でページ値を保存したり、あなたがそれらを

関連する問題