前提・実現したいこと
GAS入門者です。
練習として、ウェブサイトの更新通知プログラムの作成をしています。
スクレイピング後の出力をスプレッドシート(ss)に転記する段階でエラーに躓いています。
実行の度に、シート「new」の内容と真偽判定し、更新があるときのみ上書きされる仕様が理想的です。
なお、例としてNHKのページをお借りしており、出力は20行に渡ります。
練習なので、サイトの更新履歴(更新直前のものだけで可)を都度シート「old」上にコピーして残し、出力と見比べてみたいです。
発生している問題・エラーメッセージ
Exception: The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues.
(匿名) @ 無題.gs:20
scraping @ 無題.gs:8
該当のソースコード
1function scraping() { 2 const URL = "https://www3.nhk.or.jp/news/catnew.html?utm_int=news_contents_news-main_more"; 3 const response = UrlFetchApp.fetch(URL); 4 const html = response.getContentText("UTF-8"); 5 6 const sections = Parser.data(html).from('<em class="title">').to('</em>').iterate(); 7 8 sections.forEach(title => { 9 console.log([title]); 10 let output = ([title]); 11 let id = "*****"; //IDは伏字にしています 12 let ssnew = SpreadsheetApp.openById(id).getSheetByName('new').getDataRange(); 13 let values = ssnew.getValues(); 14 let lastRow = ssnew.getLastRow(); 15 let lastColumn = ssnew.getLastColumn(); 16 let ssold = SpreadsheetApp.openById(id).getSheetByName('old'); 17 ssold.getRange(1,1,lastRow,lastColumn).setValues(values); 18 if(([title])!==ssnew){ 19 let judgedNew = SpreadsheetApp.openById(id).getSheetByName('new').getRange(1,1,20,1); 20 judgedNew.setValues(output) //出力される内容と同じ文字列をシート「new」に書き込みたい 21 } 22 }); 23}
試したこと
エラーの原因と無関係かもしれませんが。
let judgedNew = SpreadsheetApp.openById(id).getSheetByName('new').getRange(1,1,20,1);
のうち最後の
.getRange(1,1,20,1)
を削除して実行させてみたところ、次のエラーが出ました。
TypeError: judgedNew.setValues is not a function
(匿名) @ 無題.gs:20
scraping @ 無題.gs:8
コードレビューを通して勉強したいので、ご協力いただければ、どんなご指摘でもありがたいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/29 03:45
2021/09/29 03:54
2021/09/29 04:47
2021/10/02 02:16