1

私は2つのことを見つけようとしています。

  1. より高速に実行されるようにコードを最適化できますか
  2. スクリプトの速度をテストする方法はありますか。

私のスクリプトは、スプレッドシートの最初のセルに貼り付けられるURL (例: https://www.sciencebase.gov/catalog/items?q=Water&max=100&format=json ) からデータを取得するだけです。次に、タイトルを格納する最初の列と概要を格納する 2 番目の列をセルに入力します。

スクリプト onEdit() を実行するトリガーを使用しているため、スプレッドシートの最初のセルが編集されるたびにスクリプトが実行されます。

ポインタ、ヒント、またはここを見ていただければ幸いです

ここに私のコードがあります、

function respondToSearch() {

     // Gets the active sheet in a spreadsheet
     var ss = SpreadsheetApp.getActiveSpreadsheet(); 

     // Gets sheet 1 and sets the first column to a width of 200 and the second 
     column to width 500
     var sheet = ss.getSheets()[0].setColumnWidth(1, 200).setColumnWidth(2, 500);
     var activeSheet = SpreadsheetApp.getActiveSheet();

     // Gets the value from the top left cell in a range
     var dataRange = activeSheet.getDataRange().getValue();

     // Sends an HTTP request to fetch the URL
     var searchResponse = UrlFetchApp.fetch(dataRange);

     // Get the response as a string and parse (string is in JSON format) 
     var parsedResponse = Utilities.jsonParse(searchResponse.getContentText());

     // Array to hold letter corresponding to spreadsheet columns
     var cellLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", 
     "m", "n", "o", "p", "q", "r", "s", "t"];

     // Loop through the "item" objects and display the properties in the 
     spreadsheet
     for (var i = 0; i < 2; i++) {  
       for (var j = 0; j < parsedResponse.items.length; j++) {      

       // Starts with items[0] (1st object) and displays the properties
       var parsedItems = [parsedResponse.items[j].title, parsedResponse.items[j]
       .summary];

       // If a property is not undefined print the property in the spreadsheet 
       else print "N/A"
       if (parsedItems[i] != undefined) {
         var print = parsedItems[i];
       }
       else {
         var print = "N/A";
       }

       // Stores the current letter corresponding to the current spreadsheet column
       var cellLtr = cellLetters[i];

       // Starts the row available to display data at number 2
       var cellNum = [j + 2];
       var cell = cellLtr + cellNum;

       sheet.setActiveCell(cell).setFontSize("9").setHorizontalAlignment("left")
       .setVerticalAlignment("top").setValue(print);
      }
     }
    } 

ありがとうございました

4

2 に答える 2

1

より高速に実行されるようにコードを最適化できますか

可能だと思います。すべてのセルではなく、範囲全体に対してフォント サイズと配置を設定するように、コードを書き直してみてください。

スクリプトの速度をテストする方法はありますか。

はい。コードは次のようになります

var start = new Date();
my_time_consuming_function();
var diff = new Date() - start;
Logger.log("my_time_consuming_function takes: " + diff + " ms");
于 2012-08-09T18:10:20.750 に答える
0

の反復ごとに検索、作成parsedItems[i]、および変更を回避できます。cellLtrj

for (var i = 0; i < 2; i++) {
    var cellLtr = cellLetters[i];
    for (var j = 0; j < parsedResponse.items.length; j++) {
        var print = (i == 0 ? parsedResponse.items[j].title : parsedResponse.items[j].summary);
        if (print == undefined)
            print = "N/A";

        var cell = cellLtr + (j + 2);

        sheet.setActiveCell(cell).setFontSize("9").setHorizontalAlignment("left")
            .setVerticalAlignment("top").setValue(print);
    }
}
于 2012-08-09T18:50:38.887 に答える