スプレッドシートに項目を追加します。
左上から【ファイル】、【編集】、、という感じで、【スクリプト実行】という項目が現れます。onOpen関数は、スプレッドシートを開いた時に実行されるイベントハンドラですね。
コード.gs
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [
{
name : "タイトルを取得する",
functionName : "update"
}
];
sheet.addMenu("スクリプト実行", entries);
}
そして、基本的な流れですね。シートのセル情報を2次元配列に格納します。
スプレッドシートのAPI操作はかなり遅いです。
なので、
①【セル情報をシートでまとめて取得する】
②【GAS側でまとめて配列処理する】
③【配列をシートにまとめて格納する】
としています。
コード.gs
function update(){
var urls = [];
var titles =[];
var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
var sheet_data = sheet.getDataRange().getValues(); // シート全体のデータを取得する。dataにはシートのデータが2次元配列で入る
Logger.log("data.length:", sheet_data.length);
urls = getUrls(sheet_data);
sheet_data = getTitles(sheet_data, urls);
setSheet(sheet_data, sheet);
}
配列からURLのデータを抜き出すところです。
コード.gs
function getUrls(sheet_data){
var urls = []; // URL列のURLを格納する
const urlColumnIndex = 0; // URL列を指定する
Logger.log("sheet_data.length:" + sheet_data.length);
for (var i = 0; i < sheet_data.length; i++) {
urls.push(sheet_data[i][urlColumnIndex]);
Logger.log("url:", urls[i]);
}
return urls;
}
ここが今回のキモですね。
スクレイピングします。
抜き出したいところを【beginning_tag】と【ending_tag】で挟まれるように指定します。下の例は、【ほにゃらら】を抜き出します。
コード.gs
function getTitles(sheet_data, urls) {
// <title> ほにゃらら</title>;
var beginning_tag = "<title>";
var beginning_index;
var ending_tag = "</title>";
var ending_index;
var html;
var url;
var titles = [];
const titleColumnIndex = 1; // タイトル列を指定する
for (var i = 0; i < urls.length; i++) {
url = urls[i];
if (i==0 && url == "URL"){
titles[i] = "タイトル";
}
if (url !== "URL"){
html = UrlFetchApp.fetch(url).getContentText('UTF-8');
beginning_index = html.indexOf(beginning_tag);
ending_index = html.indexOf(ending_tag);
if (beginning_index !== -1 && ending_index !== -1) {
titles[i] = html.substring(beginning_index + beginning_tag.length, ending_index);
}
}
Logger.log("title:", titles[i]);
}
for(i=0; i<titles.length; i++){
sheet_data[i][titleColumnIndex] = titles[i];
}
return sheet_data;
}
最後にシートにスクレイピングした文字列を格納する作業です。
ここも時間短縮するために、配列をまとめてスプレッドシートに格納してます。
コードも見易くなりますね。
コード.gs
function setSheet(sheet_data,sheet){
const LastRow = sheet.getDataRange().getLastRow();
const LastCol = sheet.getDataRange().getLastColumn();
sheet.getRange(1,1,LastRow,LastCol).setValues(sheet_data);
}