ブックマークのタグ追加

今のところ使えそう。

(function() {
  function bookmark_add(id, tags)
  {
    return $.ajax({
      url: 'https://www.pixiv.net/bookmark_add.php?id=' + id,
      type: 'POST',
      data: {
        comment: '',
        from_sid: '',
        id: id,
        mode: 'add',
        original_order: '',
        original_p: 1,
        original_rest: 'show',
        original_tag: '',
        original_untagged: 0,
        restrict: 0,
        tag: tags,
        tt: pixiv.context.token,
        type: 'illust',
      },
      timeout:10000,
    });
  }
  
  var c = 0;
  function update()
  {
    console.log("update", c);
    if(++c > 10) {
      console.log("Finish");
      return;
    }
    
    var deferred = (new $.Deferred()).resolve();
    $.ajax({url: 'https://www.pixiv.net/bookmark.php?untagged=1'}).done(function(data) {
      var items = $('div.display_editable_works ul li.image-item', data);
      items.each(function() {
        var img = $("img", this);
        var id = img.attr('data-id');
        var tags = img.attr('data-tags');
        deferred = deferred.then(function() {
          var ret = new $.Deferred();
          console.log(id, tags);
          bookmark_add(id, tags).
            done(function(data) { console.log("done"); }).
            fail(function(XMLHttpRequest, textStatus, errorThrown) { console.log("fail", textStatus); }).
            always(function() { ret.resolve(); });
          return ret.promise()
        });
      });
      if(items.length > 0)
      {
        deferred.then(function() { update(); });
      } else {
        console.log("Finish");
      }
    });
  }
  update();
})();

SW履歴を取得する

このSW履歴を取得する。
https://www.sbifxt.co.jp/fxtaccount/pc/SWHis


参考:
JavaScriptでHtmlのtable要素をCSVに変換する
https://ateraimemo.com/JavaScript/table2csv.html

var downloadAsTextFile = function(fileName, content) {
    var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
    var blob = new Blob([bom, content]);
    var url = window.URL || window.webkitURL;
    var blobURL = url.createObjectURL(blob);

    var a = document.createElement('a');
    a.download = fileName;
    a.href = blobURL;
    a.click();  
};
var downloadAsCSVFile = function(fileName, rows) {
  var content = "";
  for( var i in rows) {
    var ary = rows[i];
    for (var j = 0, m = ary.length; j < m; ++j) {
      content += '"' + ("" + ary[j]).replace('"', '""') + '"';
      if (j !== m) {
        content += ',';
      }
    }
    content += '\n';
  }
  downloadAsTextFile(fileName, content);
};
var table2array =function(table) {
  var array = [];
  var tr = table.getElementsByTagName('tr');
  for(var i = 0; i < tr.length; ++i)
  {
    //前行のセルのcolspanで、すでにこの行は初期化されている場合がある
    array[i] = array[i] || [];
    var cells = tr.item(i).cells;
    for(var j = 0; j < cells.length; ++j)
    {
      var td = cells.item(j);
      //タグの削除、タブをスペースに置換、両側trim、ダブルクオートの二重化
      var text = td.innerHTML.replace(/<.*?>/mg, '').replace(/\t/g,' ').replace(/(^\s+)|(\s+$)/g, '').replace(/\"/, '""');
      //前の行のrowspanですでにこのセルが使用されている場合はxoffだけ移動
      var xoff = 0;
      while(array[i][j + xoff] != null) { ++xoff; }
      array[i][j + xoff] = text;
      for(var k = 1; k < td.colSpan; ++k)
      {
        array[i][j + xoff + k] = text;
      }
      for(var l = 1; l < td.rowSpan; ++l)
      {
        array[i + l] = array[i + l] || [];
        for(var k = 0; k < td.colSpan; ++k)
        {
          array[i + l][j + xoff + k] = text; //同文字列 '〃';
        }
      }
    }
  }
  return array;
};


function getSW(form, queries)
{
  var q = queries.pop();
  if(!q) return;
  
  console.log(q.y + "_" + q.m, q.q);
  $.ajax({
    url:  form.attr('action'),
    type: form.attr('method'),
    data: q.q,
    success: function(res)
    {
      var table = $(res).find("table").get(0);
      console.log(table);
      if(table)
      {
        downloadAsCSVFile("sw_" + q.y + "_" + q.m + ".csv", table2array(table));
      }
      setTimeout(function() { getSW(form, queries);}, 1000);
    }
  });
}
var form = $("form");
var year = $("[name=YEAR] option", form);
var month = $("[name=MONTH] option", form);
var queries= [];
year.map(function() { return this.text; }).each(function(i, y) {
  month.map(function() { return this.text; }).each(function(i, m)
  {
    year.val(y);
    month.val(m);
    queries.push({y: y, m: m, q: $("form").serialize()});
  });
});

getSW(form, queries);

Google、スプレッドシートのピボットテーブルで,データ範囲の更新

Excelのピボットテーブルではデータ範囲に式を使うことができるが,スプレッドシートだとどうも無理みたい。
だからといってあらかじめ広めのデータ範囲を指定すると,空欄ができてしまうし,
この空欄をフィルタリングすると,自動で行が追加されてもフィルタリング条件は更新されないので表示されない。

で,データの追加は元々スクリプトで行うからスクリプトで更新できる方法を探してみた。
一応これでシート名指定すると指定されたシートのピボットテーブルのデータ範囲は更新はできる模様。
(Google の拡張サービスからGoogle Sheets APIの有効が必要だけど)

それにしてもピボットテーブル辺りはExcelの方が使いやすいな。。。
グラフも連動しないし。。。

function updatePivotTable(pivotTableSheetName) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var pivotTableSheetId = ss.getSheetByName(pivotTableSheetName).getSheetId();
  
  var fields = "sheets(properties.sheetId,data.rowData.values.pivotTable)";
  var sheets = Sheets.Spreadsheets.get(ss.getId(), {fields: fields}).sheets; 
  for (var i in sheets) {
    if (sheets[i].properties.sheetId == pivotTableSheetId) {
      var pivotTableParams = sheets[i].data[0].rowData[0].values[0].pivotTable;
      break;
    }
  }

  var sourceSheetId = pivotTableParams.source.sheetId || 0;
  for(var [i, sht] in ss.getSheets()) {
    if(sourceSheetId == sht.getSheetId()) {
      var sourceSheet = sht; 
    }
  }
  
  // Update source range:
  pivotTableParams.source.endRowIndex = sourceSheet.getLastRow();
  
  // Send back the updated params
  var request = {
    "updateCells": {
      "rows": {
        "values": [{
          "pivotTable": pivotTableParams
        }]
      },
      "start": {
        "sheetId": pivotTableSheetId
      },
      "fields": "pivotTable"
    }
  };

  Sheets.Spreadsheets.batchUpdate({'requests': [request]}, ss.getId());
}

参考:https://sites.google.com/site/scriptsexamples/learn-by-example/google-sheets-api/pivot

とあるサイトから情報を取得するJavaScript

クロスサイトスクリプティング対策で行けないかと思ったけど,window.openだとリダイレクトで同じホストになるから行けるみたい。

var downloadAsTextFile = function(fileName, content) {
    var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
    var blob = new Blob([bom, content]);
    var url = window.URL || window.webkitURL;
    var blobURL = url.createObjectURL(blob);

    var a = document.createElement('a');
    a.download = fileName;
    a.href = blobURL;
    a.click();  
};
var downloadAsCSVFile = function(fileName, rows) {
  var content = "";
  for( var i in rows) {
    var ary = rows[i];
    for (var j = 0, m = ary.length; j < m; ++j) {
      content += '"' + ("" + ary[j]).replace('"', '""') + '"';
      if (j !== m) {
        content += ',';
      }
    }
    content += '\n';
  }
  downloadAsTextFile(fileName, content);
};
var getInfo = function(urls, rows_or_cb, callback) {
  var rows = rows_or_cb;
  if(!Array.isArray(rows)) {
    rows = [["名称", "信託報酬", "信託財産留保額"]];
    callback = rows_or_cb;
  }
  var url = urls.pop();
  if(!url) {
    callback(rows);
    return;
  }
  console.log("open", url, "count", urls.length);
  var w =window.open(url, "dummy", 'width=100,height=100');
  $(w).load(function() {
    var t = $(w.document).find("#CONTENTSAREA01");
    rows.push([
      w.location.href.match(/param6=(\w+)/i)[1],
      t.find("div.md-l-utl-mt10 > h3:first").text().trim(),
      t.find("p:contains('信託報酬')").closest("tr").next("tr").text().trim(),
      t.find("p:contains('信託財産留保額')").closest("tr").next("tr").text().trim(),
    ]);
    w.close();
    getInfo(urls, rows, callback);
  });
};
var urls = $("tr.md-l-tr-03 td.vaM > a").filter(function(){ return this.href.match(/param6=(\w+)/i); }).map(function(){ return this.href; }).toArray();

getInfo(urls, function(rows) {
  downloadAsCSVFile("hoge.csv", rows);
});
urls=$(".middleAreaM2 tr tr:contains('投資信託(金額/特定預り)')").next().find("tr a[href*='ActionID=DefaultAID']").filter(function(){return this.href.match(/fund_sec_code=\w+/)}).map(function(){return this.href}).toArray();

JavascriptでTableをCSVで保存する

とあるサイトの項目をCSVに保存する。

var downloadAsTextFile = function(fileName, content) {
    var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
    var blob = new Blob([bom, content]);
    var url = window.URL || window.webkitURL;
    var blobURL = url.createObjectURL(blob);

    var a = document.createElement('a');
    a.download = fileName;
    a.href = blobURL;
    a.click();  
};
var downloadAsCSVFile = function(fileName, rows) {
  var content = "";
  for( var i in rows) {
    var ary = rows[i];
    for (var j = 0, m = ary.length; j < m; ++j) {
      content += '"' + ("" + ary[j]).replace('"', '""') + '"';
      if (j !== m) {
        content += ',';
      }
    }
    content += '\n';
  }
  downloadAsTextFile(fileName, content);
};
rows=[]; $("tr.md-l-tr-03 td.vaM > a").each(function(){ rows.push([this.innerHTML, this.href.match(/param6=(\w+)/i)[1]]);  })
downloadAsCSVFile("hoge.csv", rows);

クロスサイトスクリプティング対策め〜,ホスト名が違うからページ詳細取得できない。苦肉の策。。。

param=[]; $("tr.md-l-tr-03 td.vaM > a").each(function(){ param.push(this.href.match(/param6=(\w+)/i)[1]); }); param;
var downloadAsTextFile = function(fileName, content) {
    var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
    var blob = new Blob([bom, content]);
    var url = window.URL || window.webkitURL;
    var blobURL = url.createObjectURL(blob);

    var a = document.createElement('a');
    a.download = fileName;
    a.href = blobURL;
    a.click();  
};
var downloadAsCSVFile = function(fileName, rows) {
  var content = "";
  for( var i in rows) {
    var ary = rows[i];
    for (var j = 0, m = ary.length; j < m; ++j) {
      content += '"' + ("" + ary[j]).replace('"', '""') + '"';
      if (j !== m) {
        content += ',';
      }
    }
    content += '\n';
  }
  downloadAsTextFile(fileName, content);
};

var jqXHRList=[];
$(param).each(function(i,e){
  jqXHRList.push($.ajax({
    type: "GET",
    contentType: "text/html",
    url: "https://site0.sbisec.co.jp/marble/fund/detail/achievement.do?Param6=" + e,
  }));
})

$.when.apply($, jqXHRList).done(function() {
  var rows = [["名称", "信託報酬", "信託財産留保額"]];
  for(var i in arguments) {
    h=$($.parseHTML(arguments[i][0]));
    t=h.filter("#CONTENTSAREA01");
    rows.push([
      t.find("div.md-l-utl-mt10 > h3:first").text().trim(),
      t.find("p:contains('信託報酬')").closest("tr").next("tr").text().trim(),
      t.find("p:contains('信託財産留保額')").closest("tr").next("tr").text().trim(),
    ]);
  }
  downloadAsCSVFile("hoge.csv", rows);
});